对AccessViolationException的一些总结
引言
开发Winform程序时,应用程序出现了异常,整个应用程序崩溃自动退出了。在断点调试后,发现异常是AccessViolationException。所以对周围的语句加上了异常的处理机制。但是接下来发现异常捕捉竟然不起效果。。。。。(第一次见)。在此记录,共朋友们学习参考。
过程
基于组件开发了语音视频聊天小工具。测试了下极端情况(没有摄像头我来录制自己的视频)。原本我以为没有摄像头的情况下,初始化连接我的摄像头就会出错,所以我在逻辑的前部分就添加了异常处理。但是发现代码可以正常的初始化和启动,当我停止录制时,发生了异常。出现异常的代码如下:
1 if (this.maker != null) 2 { 3 try 4 { 5 this.maker.Close(true); 6 } 7 catch (AccessViolationException ex) 8 { 9 MessageBox.Show("录制视频失败!"); 10 } 11 finally 12 { 13 this.maker = null; 14 } 15 }
在代码的第5行,出现了AccessViolationException的异常。但是catch捕捉不到。什么情况,之前从未遇到过。。。。。无奈只能百度,看有没有前辈遇到此类问题。去MSDN查询了下AccessViolationException的情况。MSDN上说的很清楚。如下:
看来,没有摄像头就进行视频的录制的确访问了非法的内存。我又查询了MSDN中对AccessViolationException类的解释,看到下面这段话,我才知道原来可以通过添加一个属性来捕捉这个异常。如下:
解决与总结
后来,我看到了一篇文章谈到了这个问题。如下:
在.net4.0 中,系统某些SEH异常默认是不被捕获的,该类异常称作Corrupted State Exceptions (CSE)
MS不推荐,捕获此类异常,因为此类异常不解决,应用可能会导致更严重的错误.建议重启该应用程序.出现此类异常的原因,往往需要解决.而不是简单的的捕获.所以.NET4.0中不让捕了(早干啥去了,到.NET才这样处理).但有些时候,我们的确要捕获此类异常,或者说调用的是第三方的库.我们根本无法彻底解决这种问题. .NET4.0 提供了如下的方法捕获:添加[HandleProcessCorruptedStateExceptions]属性。和MSDN上面说的一致。
通过这次经历,让我知道了CSE这种机制的存在。以前只知道出现异常时可以捕捉到的。但是CLR 4.0以后,微软对CLR进行了相关的改进。对于严重的异常,CLR不会吧异常抛出给你,操作系统会自动停止该进程。下面有两篇文章都是关于这个方面的。其中一篇涉及到我们日常写代码中的异常处理的使用。我觉得非常好。在此将链接发给大家。
http://www.cnblogs.com/solo/archive/2011/09/27/2193360.html
关于CSE的一篇文章
https://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035
谈到了CLR对于CSE这种异常处理的演变,也提醒我们写出好的代码不是容易的
http://blog.csdn.net/zztfj/article/details/12832425
致谢
谢谢上面分享这种问题的作者和朋友,我在此仅仅抛砖引玉,希望遇到此类问题的同学可以快速的解决问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」