3

我有这个代码块:

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 语句来识别空值会更有效吗?

4

3 回答 3

11

是的,这是不好的做法,因为抛出和捕获异常是相当昂贵的,并且异常不应该用于常规操作,仅用于错误处理。

解决这个问题的首选方法是检查对象是否是null你自己并适当地处理这种情况。

于 2013-10-22T08:44:53.823 回答
2

使用 try/catch 是否更“昂贵”(即更慢)在这里似乎不如代码可靠性重要。您对代码的有效处理是:

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

于 2013-10-22T08:54:43.903 回答
1

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

编辑:

我的意思措辞更好的例子:

作为普通执行的一部分,不应使用异常来更改程序的流程。异常只能用于报告和处理错误情况。

http://msdn.microsoft.com/en-us/library/ms173163.aspx

于 2013-10-22T08:45:15.740 回答