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

时间:2011-09-12 19:14:41

标签: c# .net vb.net

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

8 个答案:

答案 0 :(得分:29)

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

  

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

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

  

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

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

答案 1 :(得分:7)

肯定会抓住{p> NullReferenceException。你从哪里得到了这个想法?

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

唯一无法捕获的是StackOverflowException,而TreadAbortException会在捕获结束时重新投放。

答案 2 :(得分:3)

ThreadAbortException

注意:

  

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

答案 3 :(得分:3)

一些异常,即使你抓住它们也会一直被重新抛出。 StackOverflowException是我能想到的唯一的。可能ThreadAbortedException

答案 4 :(得分:1)

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

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

答案 5 :(得分: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时,无效状态会导致运行时崩溃。

答案 6 :(得分:0)

我不知道您提到NullReferenceExceptions的原因。 NullReferenceExceptions是我捕获的主要例外之一。我唯一可以想到的就是内存异常或StackOverflow,因为只要你内存不足,执行就会停止,所以很有可能异常无法捕获。

答案 7 :(得分:0)

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