我在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上的Framework 4.0)。
感谢您的任何提示。
答案 0 :(得分:8)
默认情况下,您无法捕获AccessViolationException,因为它表示尝试读取或写入受保护的内存。您可以将[HandleProcessCorruptedStateExceptions]
属性添加到发生它的方法中:
默认情况下,公共语言运行库(CLR)不会向托管代码提供这些例外,并且尝试 / * catch *块(以及其他异常处理)没有为他们调用。如果您完全确定要保持对这些异常的处理,则必须将 HandleProcessCorruptedStateExceptionsAttribute 属性应用于要执行其异常处理子句的方法。 CLR仅在具有 HandleProcessCorruptedStateExceptionsAttribute 和SecurityCriticalAttribute属性的方法中将已损坏的进程状态异常传递给适用的异常子句。