You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8中如何捕获AccessViolationException并在程序崩溃前记录日志

.NET 8中如何捕获AccessViolationException并在程序崩溃前记录日志

我最近碰到个头疼的问题:代码里有一段不受我控制的逻辑会抛出AccessViolationException,直接导致程序崩溃——不管是控制台应用还是WinForms应用都是这个情况。我其实不想修复这个异常(也没权限修第三方代码),就想在程序彻底崩掉之前,把错误日志写下来,不用每次都费劲去事件查看器里找记录。

之前在.NET Framework 4里,我只要在app.config里加一段配置就能搞定,但到了.NET 8,这些老方法全不管用了:

  • 试过添加[HandleProcessCorruptedStateExceptions]属性,结果这玩意儿在.NET 8里已经废弃了,而且就算硬加也拦不住崩溃;
  • 还试过在程序启动时设置COMPlus_legacyCorruptedStateExceptionsPolicy环境变量,同样没效果;
  • 查了官方的讨论才知道,这些旧方案在.NET 8里已经不被支持了。

后来终于找到了解决办法:在.NET 8里,要启用旧的损坏状态异常处理策略,得通过.runtimeconfig.json文件来配置,具体步骤如下:

  1. 找到或创建.runtimeconfig.json文件
    如果是用Visual Studio创建的项目,根目录里应该已经有一个<你的项目名>.runtimeconfig.json文件;要是没有,直接在项目根目录新建一个就行。

  2. 添加配置项
    在文件的runtimeOptions节点下,新增configProperties字段,把System.Runtime.EnableLegacyCorruptedStateExceptionsPolicy设为true,示例配置如下:

{
  "runtimeOptions": {
    "tfm": "net8.0",
    "frameworks": [
      {
        "name": "Microsoft.NETCore.App",
        "version": "8.0.0"
      }
    ],
    "configProperties": {
      "System.Runtime.EnableLegacyCorruptedStateExceptionsPolicy": true
    }
  }
}
  1. 配合异常捕获代码
    配置完之后,你就可以用try-catch捕获AccessViolationException了,别忘了加上[HandleProcessCorruptedStateExceptions]属性(虽然废弃,但配合这个配置还是需要的),示例代码:
[HandleProcessCorruptedStateExceptions]
private bool MethodThatThrowsException(string filePath)
{
    try
    {
        // 这里放调用第三方逻辑的代码
    }
    catch (AccessViolationException ex)
    {
        // 在这里实现你的日志记录逻辑,比如写入本地文件
        WriteErrorLog($"触发AccessViolationException:{ex.Message}", ex);
        // 抛出异常让程序正常崩溃,不要尝试继续执行
        throw;
    }
}

需要注意的是,AccessViolationException属于损坏状态异常,意味着进程的内部状态可能已经被破坏,所以记录完日志后,最好直接让程序退出,不要尝试恢复或继续运行。

备注:内容来源于stack exchange,提问作者Amit Joshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:18:12