关于c#:使用Try-Catch来处理看到的错误,是不是很糟糕?

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语句来标识空值,效率会更高吗?


是的,这是一个糟糕的实践,因为抛出和捕获异常非常昂贵,并且异常不应该用于常规操作,只用于错误处理。

解决这个问题的首选方法是检查对象是否是null,并适当地处理这个问题。


使用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)避免掩盖您没有预料到的潜在问题。


尝试捕获是相对昂贵的操作,应仅在"特殊情况"下使用,不应在您计划的情况下使用。

编辑:

一个更好的例子,我的意思是:

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