【问题标题】:Use Try-Catch to handle seen errors, is it bad?使用 Try-Catch 处理看到的错误,是不是很糟糕?
【发布时间】:2013-10-31 00:53:45
【问题描述】:

我有这个代码块:

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块中再次抛出。
  • 如果您知道为什么您可能会创建并尝试使用空引用,那么您应该在此时检查并处理。如果你不知道为什么,只是用一个 catch 块来修复症状,那么你最好尝试找到问题的根源。

标签: c# try-catch


【解决方案1】:

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

编辑:

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

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • “他们”总是告诉我们这很贵。也许它已经成为一个都市传奇,比如“HTTPS 比 HTTP 更占用服务器资源”?!?
  • 不管怎样,它们肯定比 if (obj != null) ... 更昂贵... :) 但即使它们不是,异常也是为了处理超出正常范围的程序行为程序的执行流程。如果不加选择地使用它们会使代码变得非常混乱和不可维护。
  • @UweKeim 即使这样,异常也不是为了处理常规流程而设计的,在这种情况下应该避免。一个简单的if 条件更准确地描述了预期的行为。
  • 我们都同意这是不好的做法。在您的评论中,您给出了原因:它们并不意味着处理常规控制流。但是在您的回答中,您认为原因是异常成本很高。即使他们是,那也是错误的原因。
  • @KrisVandermotten 我已将此添加到我的答案中。
【解决方案3】:

使用 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) 在您预期问题发生的特定点测试空值,您可以避免掩盖您未预料到的潜在问题。

【讨论】:

  • 我同意。奇怪的是,这里你同意我上面的 cmets,而上面你说它们不是真的?
  • @KrisVandermotten,我想我一定是误解了你。对此感到抱歉:)
  • 没关系 ;-)。我给了你+1,因为这是我认为最好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2010-11-06
  • 2011-09-20
  • 2010-12-09
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多