无法在.NET中捕获的异常列表

问题描述 投票:15回答:8

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

c# .net vb.net
8个回答
29
投票

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

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

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

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

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


7
投票

NullReferenceException当然可以被抓住。你是从哪里得到这个想法的?

try {} catch {}将捕获非托管异常以及托管异常(请注意catch上没有异常条款)。

唯一一个无法捕获的是StackOverflowException,而TreadAbortException在捕获结束时被重新抛出。


3
投票

ThreadAbortException

注意:

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


3
投票

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


1
投票

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

例如,代码契约框架中的ContractException有意将internal设置为其程序集,以便您无法尝试明确地捕获它。


1
投票

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

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

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

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.