无法在.NET中捕获的exception列表

什么是.NET中无法捕获的exception列表? 或者我在哪里可以找到这样的清单?

无法直接捕获的唯一exception是(抛出框架) StackOverflowException 。 从逻辑上讲,这是有道理的,因为您没有堆栈中的空间来处理此时的exception。 来自文档:

从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,并且默认情况下会终止相应的进程。

可以捕获ThreadAbortException ,但总是会重新引发,因此具有独特的行为。 来自文档:

ThreadAbortException是一个可以捕获的特殊exception,但它会在catch块的末尾自动再次引发。

另请注意,某些AccessViolationException实例是损坏的状态exception, 默认情况下可能无法处理。 这些可以处理,但需要通过属性进行额外处理。 有关详细信息,请参阅处理损坏的状态exception 。

当然可以捕获NullReferenceException 。 你是从哪里得到这个想法的?

try {} catch {}将捕获非托管exception以及托管exception(请注意catch上没有exception子句)。

唯一一个无法捕获的是StackOverflowException ,并且TreadAbortException在catch的末尾被TreadAbortException

ThreadAbortException

注意:

ThreadAbortException是一个可以捕获的特殊exception,但它会在catch块的末尾自动再次引发 。 引发此exception时,运行时会在结束线程之前执行所有finally块。

好吧有一些例外,即使你抓住它们也总会被重新抛出。 StackOverflowException是我能想到的唯一的atm。 可能是ThreadAbortedException

由于可访问性而无法按类型引用的任何exception都无法显式捕获,但可以使用基本Exception类型捕获。

例如,代码契约框架中的ContractException是故意在其程序集internal进行的,因此您无法尝试明确地捕获它。

试试这个……(在.NET Core 2.0上测试过)

 System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(Type).GetType()).ToString() 

抛出一个忽略所有try / catch / finally块的System.ExecutionEngineException ,即使它被弃用,说运行时不再是这种类型的excpetion。 很奇怪,是吗?

原因可能是typeof(Type).GetType()返回typeof(System.RuntimeType) ,它是一个内部类型和一个运行时内在函数。 System.Runtime.Serialization.FormatterServices.GetUninitializedObject关于这些类型(如typeof(string)的参数validation,但开发人员可能忘记检查此非公共类型。 因此,返回无效的System.RuntimeType 。 调用ToString ,无效状态会导致运行时崩溃。

我不知道你为什么提到NullReferenceExceptionsNullReferenceExceptions是我捕获的主要exception之一。 我能想到的唯一一个是内存exception或StackOverflow ,因为只要你内存不足,执行就会停止,所以exception很可能不会被抓住了

在某些情况下无法捕获SEHException。 它可以由非托管代码抛出。 这个主题的一个很棒的SO线程出现在这里: SEHException未被Try / Catch捕获