【问题标题】:Can't catch 0xC0000005 exception in C#无法在 C# 中捕获 0xC0000005 异常
【发布时间】: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)。

感谢任何提示。

【问题讨论】:

标签: c# .net exception try-catch


【解决方案1】:

默认情况下,您无法捕获 AccessViolationException,因为它表示尝试读取或写入受保护的内存。不过,您可以将[HandleProcessCorruptedStateExceptions] 属性添加到它发生的方法中:

默认情况下,公共语言运行时 (CLR) 不会将这些异常传递给托管代码,并且 try/*catch* 块(以及其他异常处理子句)不会为它们调用。如果您绝对确定要保持对这些异常的处理,则必须将 HandleProcessCorruptedStateExceptionsAttribute 属性应用于要执行其异常处理子句的方法。 CLR 仅在具有 HandleProcessCorruptedStateExceptionsAttributeSecurityCriticalAttribute 属性的方法中将损坏的进程状态异常传递给适用的异常子句。

【讨论】:

  • 这个答案很有用,谢谢。我知道那是很久以前的事了,但是当您说“如果您绝对确定要处理这些异常”时,添加 [HandleProcessCorruptedStateExceptions] 属性对性能有什么不利影响吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
相关资源
最近更新 更多