无法在 C# 中捕获 0xC0000005 异常
Posted
技术标签:
【中文标题】无法在 C# 中捕获 0xC0000005 异常【英文标题】:Can't catch 0xC0000005 exception in C# 【发布时间】:2012-06-15 18:14:10 【问题描述】:我的 C#.Net 程序出现以下异常:
System.Data.dll 中发生了“System.Data.SqlClient.SqlException”类型的第一次机会异常 myapp.exe 中 0x000007feff75121b 的第一次机会异常:0xC0000005:访问冲突读取位置 0x0000000000000000。 CustomMarshalers.dll 中出现了“System.AccessViolationException”类型的第一次机会异常 CustomMarshalers.dll 中出现“System.AccessViolationException”类型的未处理异常 附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。
我在 try/catch(Exception) 块中得到它,但它从未被捕获。
我正在尝试调试它以了解它发生的原因,但如果不抓住它就很难做到这一点。
是否可以在 C#.Net 中捕获 0xC0000005 异常? (Windows 2008 R2 上的框架 4.0)。
感谢任何提示。
【问题讨论】:
异常是SqlException
,可能是由于尝试取消引用空指针引起的。
这是一个访问冲突异常。查看此回复:***.com/questions/3469368/…
【参考方案1】:
默认情况下,您无法捕获 AccessViolationException,因为它表示尝试读取或写入受保护的内存。不过,您可以将[HandleProcessCorruptedStateExceptions]
属性添加到它发生的方法中:
默认情况下,公共语言运行时 (CLR) 不会将这些异常传递给托管代码,并且 try/*catch* 块(以及其他异常处理子句)不会为它们调用。如果您绝对确定要保持对这些异常的处理,则必须将 HandleProcessCorruptedStateExceptionsAttribute 属性应用于要执行其异常处理子句的方法。 CLR 仅在具有 HandleProcessCorruptedStateExceptionsAttribute 和 SecurityCriticalAttribute 属性的方法中将损坏的进程状态异常传递给适用的异常子句。
【讨论】:
这个答案很有用,谢谢。我知道那是很久以前的事了,但是当您说“如果您绝对确定要处理这些异常”时,添加 [HandleProcessCorruptedStateExceptions] 属性对性能有什么不利影响吗?以上是关于无法在 C# 中捕获 0xC0000005 异常的主要内容,如果未能解决你的问题,请参考以下文章
来自 JNI_CreateJavaVM (jvm.dll) 的异常 0xC0000005
java - 来自JNI_CreateJavaVM(jvm.dll)的异常0xC0000005
Project3.exe 中 0x00C61540 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000003
task2.exe 中 0x001066F6 处未处理的异常:0xC0000005:访问冲突读取位置 0x0000000C [关闭]