哪种类型的例外没有捕获?

时间:2011-04-01 00:03:21

标签: c# .net exception exception-handling

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

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

此外,catch块中的操作过程是否总是在rethrow,wrap / rethrow和log之间?是否存在需要在catch块中执行某些其他操作的情况?

由于

3 个答案:

答案 0 :(得分:15)

通常的建议适用,只能抓住你能处理的东西。框架内部有一个名为IsCriticalException的实用程序函数,它通常被框架代码的一部分用来决定是否吞下异常。不妨再去吧。它考虑以下关键:

  • 的NullReferenceException
  • StackOverflowException(uncatchable)
  • OutOfMemoryException异常
  • ThreadAbortException
  • ExecutionEngineException(4.0中无法访问)
  • IndexOutOfRangeException
  • AccessViolationException

这是一个很好的清单。

答案 1 :(得分:12)

我会使用Eric Lippert的建议而不是“致命”例外:

http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

答案 2 :(得分:0)

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