.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文件来配置,具体步骤如下:
找到或创建.runtimeconfig.json文件
如果是用Visual Studio创建的项目,根目录里应该已经有一个<你的项目名>.runtimeconfig.json文件;要是没有,直接在项目根目录新建一个就行。添加配置项
在文件的runtimeOptions节点下,新增configProperties字段,把System.Runtime.EnableLegacyCorruptedStateExceptionsPolicy设为true,示例配置如下:
{ "runtimeOptions": { "tfm": "net8.0", "frameworks": [ { "name": "Microsoft.NETCore.App", "version": "8.0.0" } ], "configProperties": { "System.Runtime.EnableLegacyCorruptedStateExceptionsPolicy": true } } }
- 配合异常捕获代码
配置完之后,你就可以用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
相关产品推荐
相关产品推荐

