哪种类型的例外没有捕获?
很多时候,它被提到只捕获我可以处理的exception(抛出,包装和/或记录,或执行一些其他操作)。
哪些例外无法处理? 这是不应该被抓住的意思吗? 我知道不应该捕获可能表示对象引用为null的exception,因为它们是编程错误而不是用户激发的。 还有其他例子吗? 另一个是ExecutionEngineException
。
此外,catch块中的操作过程总是在rethrow,wrap / rethrow和log之间吗? 是否存在需要在catch块中执行某些其他操作的情况?
谢谢
通常的建议适用,只抓住你能处理的东西。 框架内部有一个名为IsCriticalException的实用程序函数,它通常被框架代码的某些部分用来决定是否吞下exception。 不妨再去吧。 它考虑以下关键:
- 的NullReferenceException
- StackOverflowException(无法捕获)
- OutOfMemoryExceptionexception
- ThreadAbortException
- ExecutionEngineException(在4.0中无法访问)
- IndexOutOfRangeException
- AccessViolationException
这是一个很好的清单。
我会使用Eric Lippert的建议,而不是捕获“致命”例外:
http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx
catch块中的操作过程可能并不总是重新抛出,包装/回滚和记录。 我已经看到dbexception(如死锁)导致exception被抛出然后catch逻辑再次尝试执行数据库操作,希望锁定的资源不再被锁定。