【问题标题】:Which types of exception not to catch?哪些类型的异常不能捕获?
【发布时间】:2011-04-01 00:03:20
【问题描述】:

很多时候,有人提到只捕获我可以处理的异常(抛出、包装和/或记录,或执行一些其他操作)。

哪些异常不能处理?这和不应该被抓住的意思是一样的吗?我知道不应该捕获可能表示对象引用为空的异常,因为它们是编程错误而不是用户引发的。还有其他例子吗?另一个是ExecutionEngineException

另外,catch 块中的操作过程是否总是在重新抛出、换行/重新抛出和记录之间?是否存在需要在 catch 块中执行其他操作的情况?

谢谢

【问题讨论】:

  • 我不太明白这个问题。您知道可以处理哪些异常。这是您在异常处理程序中专门编写的 code 来处理的。这是你可以修复的。 如果你不确定,你就无法处理它们,所以你不应该抓住它们。
  • 对这个问题的回答也可能会有所帮助:stackoverflow.com/q/7152354/625332

标签: c# .net exception exception-handling


【解决方案1】:

通常的建议适用,只抓住你能处理的。框架内部有一个名为 IsCriticalException 的实用函数,框架代码的某些部分非常常用它来决定是否吞下异常。还不如就这样过去。它认为以下关键:

  • NullReferenceException
  • StackOverflowException(无法捕获)
  • OutOfMemoryException
  • ThreadAbortException
  • ExecutionEngineException(在 4.0 中无法捕获)
  • IndexOutOfRangeException
  • AccessViolationException

这是一个很好的清单。

【讨论】:

  • 大多数正确编写的应用程序不需要知道这个列表,因为它们会同等对待所有未处理的应用程序:它们只会让 CLR 终止进程。他们不会吞下所有东西,除了 list_of_exceptions_that_is_considered_to_be_critical_by_Microsoft.VisualStudio.Shell.10.0。有趣的是,这种方法存在思想。
  • Is this the property you're talking about? 我没有看到任何其他类似的处理程序。
  • System.ClientUtils.IsCriticalException,它是一个内部方法。
【解决方案2】:

我会使用 Eric Lippert 的建议,而不是捕获“致命”异常:

https://ericlippert.com/2008/09/10/vexing-exceptions

【讨论】:

  • 这里是 C# msdn.microsoft.com/en-us/library/z4c5tckx(v=vs.80).aspx的异常层次结构@
  • Eric 还建议不要捕获“Boneheaded”异常,因为这样做会隐藏代码中的错误。
  • 正确的链接是Exception Hierarchy
  • 链接不错,Eric 的博客总是值得一读。但它没有回答哪些异常不能被捕获的问题。 Hans Passant 给出了最接近的答案。
【解决方案3】:

catch 块中的操作过程可能并不总是重新抛出、换行/返回和记录。我已经看到数据库异常(如死锁)导致抛出异常,然后 catch 逻辑尝试再次执行数据库操作,希望锁定的资源不再被锁定。

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多