【问题标题】:AccessViolationException not caught despite HandleProcessCorruptedStateExceptions尽管有 HandleProcessCorruptedStateExceptions,但未捕获 AccessViolationException
【发布时间】:2017-02-27 21:06:25
【问题描述】:

我很困惑。 AccessViolationException 是由第三方库随机生成的。它可以安全地被忽略,所以我按照建议的here 将调用方法包装在[HandleProcessCorruptedStateExceptions] 属性中。

但是,我仍然看到引发异常,如下所示:

我正在使用 .NET Framework 4.6.2 和 Visual Studio 2015 Update 3。我可能错过了什么?

【问题讨论】:

  • 不应该 [HandleProcessCorruptedStateExceptions] 无论传递的对象如何工作吗?有什么关系?
  • 呃,等等,它成功了。该异常并未像 CSE 通常那样终止您的程序。您承诺您将使用该属性处理异常,但您没有。注意不要滥用该属性,您不能再次调用该第 3 方库。这要求你要么终止你的程序并给出一个体面的错误报告(订阅 AppDomain.UnhandledException 事件),要么设置一个静态 bool 变量来抑制对该库的任何进一步调用。请记住,调试器总是在引发事件之前介入。
  • @HansPassant 你完全正确! (事实上​​,毫不夸张地说,这几乎总是如此,因为在我看来,您是这里最聪明的人之一。)在AccessViolationException 之后,除了终止进程之外,没有什么是真正安全的了。我没有在回答中提到您的预防性警告,因为 OP 表示忽略此异常是安全的,我只是想尊重这一点。 (我假设他已经分析了异常的原因。)

标签: c# visual-studio debugging exception access-violation


【解决方案1】:

您忘记在table.Start() 周围插入try/catch

[HandleProcessCorruptedStateExceptions] 肯定需要try/catch 才能捕捉到AccessViolationException

所以你的代码应该是:

[HandleProcessCorruptedStateExceptions]
private static void StartTable(Table table) {
    try
    {
        table.Start();
    }
    catch (AccessViolationException)
    {
        // Ignore
    }
}

您可以查看herehere 以获取参考。

【讨论】:

  • 谢谢!我已经包含了try/catch 块,但是在调用StartTable 的方法中,这很可能还不够。
  • @ErwinMayer 不客气! :-) 是的,try/catch 需要直接在设置了[HandleProcessCorruptedStateExceptions] 的方法中。 (从 CLR 的角度来看,任何类型的委托也是单独的方法。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多