Use Try-Catch to handle seen errors, is it bad?
我有这个代码块:
1 2 3 4 5 6 7 8 9 10 11 12
| try
{
int QuestionAnswerID = 0;
// code block which assign value to QuestionAnswerID
item.QuestionAnswerID = QuestionAnswerID;
}
catch (NullReferenceException)
{
item.QuestionAnswerID = -999;
} |
这在一个循环中运行,并且在循环中肯定会遇到2-3次catch块。这段代码正是我想要的,但只是想知道使用try-catch块处理已知问题是否是一个坏的实践。
如果在抛出多余的语句之前使用if语句来标识空值,效率会更高吗?
- Try-Catch将比使用if慢,而且使用if比Try-Catch更干净。如果不是真正的异常,不要使用Try-Catch
- 永远不要编写代码来捕获NullReferenceException。它们指示程序中存在错误。改为修复错误。
- 在catch中,你设置了item.QuestionAnswerID,如果项目是null,怎么办?
- 这里唯一能发生的NullreferenceExcpetion'是当item为空时,它将再次被抛出catch块。
- 如果您知道您可能创建和尝试使用空引用的原因,那么应该检查并处理这一点。如果你不知道原因,但只是用一个捕获块来修复症状,那么你最好设法找到问题的根源。
- @克里斯万德莫顿,这根本不是真的。返回空值以指示某种类型的错误或状态是常见的(尽管不一定是好的)实践。只要将该值视为有效值,以便捕获空异常,就会导致抛出异常,即使没有bug。
- 请阅读以下内容:blogs.msdn.com/b/ericlippert/archive/2008/09/10/…和以下内容:blogs.msdn.com/b/kcwalina/archive/2007/01/30/…,以便更好地了解异常。
- 为什么尝试…最终…好;尝试…捕获坏?
- @除了我之前说过的:不要使用NullReferenceException的抛出作为控制流机制,因为它可能会在代码中隐藏真正的错误。此外,在解引用位置显式的if比下面几行的catch块更容易理解和维护。
- @克里斯万德莫顿,我完全同意(这就是我的答案:)
是的,这是一个糟糕的实践,因为抛出和捕获异常非常昂贵,并且异常不应该用于常规操作,只用于错误处理。
解决这个问题的首选方法是检查对象是否是null,并适当地处理这个问题。
- "他们"总是告诉我们这很贵。也许它已经成为了一个城市传奇,比如"https比http更加占用服务器资源"????
- 不管怎样,它们肯定比if(obj!= NULL):)但即使它们不是,异常也意味着处理超出程序执行流正常界限的程序行为。如果不加选择地使用代码,它会使代码非常混乱和不可维护。
- @Uwekeim即使如此,异常也不是为处理规则流而设计的,在这种情况下应该避免。一个简单的if条件更准确地描述了预期的行为。
- 我们都同意这是不好的做法。在您的评论中,您给出了原因:它们不是用来处理常规控制流的。但在你的回答中,你认为原因是例外被认为是昂贵的。即使是这样,那也是错误的原因。
- @克丽丝万德莫滕,我在回答中加了这个。
- 哎呀。。。小心使用诸如"他们被称为例外是有原因的"这样的短语。请参阅我对Alex key答案的评论:stackoverflow.com/questions/19513023/…
- @克丽丝万德莫顿的观点。编辑。
使用Try/Catch是否更"昂贵"(即速度较慢),在这里似乎不如代码可靠性重要。您对代码的有效操作是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| block of code where something may go wrong
various things occur
specific thing that you have anticipated might cause an error occurs
various things occur
set return state to valid value
end of block where something may go wrong
if something went wrong
set return state to invalid value
end if
return return state |
最后得到的代码块可能在某个阶段出错。你设计它是为了解决一个预期的问题,但是其他的问题可能会发生,你会隐藏它们。通过在您期望出现问题的特定点测试空值,使用if (specific thing == null)避免掩盖您没有预料到的潜在问题。
- 我同意。奇怪的是,尽管你同意我上面的评论,而你上面说的不是真的?
- @克丽丝万德莫滕,我想我一定是误解了你。抱歉:)
- 没关系;我给了你+1,因为这是我心里最好的答案。
尝试捕获是相对昂贵的操作,应仅在"特殊情况"下使用,不应在您计划的情况下使用。
编辑:
一个更好的例子,我的意思是:
Exceptions should not be used to change the flow of a program as part
of ordinary execution. Exceptions should only be used to report and
handle error conditions.
http://msdn.microsoft.com/en-us/library/ms173163.aspx
- 这根本不是真的。请阅读:blogs.msdn.com/b/kcwalina/archive/2008/07/17/…。还可以查看blogs.msdn.com/b/kckwalina/archive/2007/01/30/…和blogs.msdn.com/b/ericlippert/archive/2008/09/10/…以更好地了解异常。
- 有趣的链接。尤其是在这一点上,被认为是异常的东西在代码的上下文中变化很大。但在这种情况下,您会同意异常是不适当的,因为它是一个已知的条件,而不是错误处理?我已经更新了我的解释。