引言

  开发Winform程序时,应用程序出现了异常,整个应用程序崩溃自动退出了。在断点调试后,发现异常是AccessViolationException。所以对周围的语句加上了异常的处理机制。但是接下来发现异常捕捉竟然不起效果。。。。。(第一次见)。在此记录,共朋友们学习参考。

过程

  基于组件开发了语音视频聊天小工具。测试了下极端情况(没有摄像头我来录制自己的视频)。原本我以为没有摄像头的情况下,初始化连接我的摄像头就会出错,所以我在逻辑的前部分就添加了异常处理。但是发现代码可以正常的初始化和启动,当我停止录制时,发生了异常。出现异常的代码如下:

 if (this.maker != null)
{
try
{
this.maker.Close(true);
}
catch (AccessViolationException ex)
{
MessageBox.Show("录制视频失败!");
}
finally
{
this.maker = null;
}
}

  在代码的第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

致谢

  谢谢上面分享这种问题的作者和朋友,我在此仅仅抛砖引玉,希望遇到此类问题的同学可以快速的解决问题。

对AccessViolationException的一些总结的更多相关文章

  1. AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    在使用SqlConnection.Open()连接到SQL Server 2008 R2 SP2时,一直报以下异常: AccessViolationException: 尝试读取或写入受保护的内存.这 ...

  2. System.AccessViolationException,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    从事件查看器中发现,IIS不定期崩溃并重启的现象.抓取crash dump文件后,发现能够看到异常,但没有堆栈信息(主要是只会看托管代码的堆栈,非托管的不清楚.),问题表现及dump日志的截图如下: ...

  3. System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    系统debug时出现错误,System.AccessViolationException: 尝试读取或写入受保护的内存.这通常指示其他内存已损坏. Attempted to read or write ...

  4. vs2013 报错AccessViolationException 解决方案

    最近 用vs2013 vs2010开发一个web 项目的时候  报AccessViolationException 异常 ,找不到原因 后边网上看了解决方法,试了一下 解决了,具体什么原因搞不清. 下 ...

  5. 我异常-VS2012“System.AccessViolationException: 试图读取或写入保护内存。”

       我的系统是win7 64位 系统 安装的是 Visual studio 2012.从SVN上下载了源代码.一个B/S的系统.能正常载入登陆页,但在输入登录信息要登录的时候,就报错了:     - ...

  6. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt".

    昨天遇到一个比较奇怪的问题,运行VS2010调试程序的时候,总是会报一个错,然后程序就挂掉了:无可用源….,弹出一个窗口提示:System.AccessViolationException: Atte ...

  7. 使用C#在VS中开发:未处理AccessViolationException “System.AccessViolationException”类型的未经处理的异常

    未处理AccessViolationException: “System.AccessViolationException”类型的未经处理的异常在System.Data.dll中发生 其他信息:尝试读 ...

  8. 未处理AccessViolationException 异常

     在进行arcgis的GP操作时,当操作栅格图像的拼接时,报错: AccessViolationException: 尝试读取或写入受保护的内存 原以为可以通过try catch屏蔽掉错误,不至于程序 ...

  9. 连接数据库及出现System.AccessViolationException错误的解决方法

    调试后发现, connection.Open();以后报错,System.AccessViolationException: 尝试读取或写入受保护的内存.这通常指示其他内存已损坏,网上搜了很多都没有作 ...

随机推荐

  1. 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

    题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...

  2. NuGet命令行工具和可视化工具

    Nuget出了命令行工具之外,还有一个可视化工具,下载地址如下: 命令行(推荐官网下载,有中文提示!):https://dist.nuget.org/index.html 可视化(简单.方便.易用): ...

  3. HDU 1754 I Hate It

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. dedecms /include/uploadsafe.inc.php SQL Injection Via Local Variable Overriding Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 . dedecms原生提供一个"本地变量注册"的模拟 ...

  5. HFSS使用记录

    一.基本设置 1.Tools \ Options,各种基本设置 1.1 Tools \ Options \ HFSS Options-> Duplicate boundaries/mesh op ...

  6. NOIp Graph 1002 瞎眼记

    又是虚脱的一天啊QAQ,早上习惯性迟到,九点多到学校开始码题,六道题看下来花了将近一个小时,主要纠结于第二题和第六题.到了十点,没再深入思考,开始码题.. 一直到十一点半,写了两道题.然后吃完饭后中午 ...

  7. 网络存储(二)之ISCSI原理

    组成 一个简单ISCSI系统大致由以下部分构成 ISCSI Initiator 或者 ISCSI HBA ISCSI Target 以太网交换机 一台或者多台服务器 结构图如下: iscsi服务器用来 ...

  8. 逐行读取txt文件

    header("Content-type:text/html; charset=utf-8"); $handle = fopen('test.php', 'r') or die(' ...

  9. linux第一面

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.作为一个 Linux系统管理员,我看了许多有关Linux的文档和书籍,并为学习 ...

  10. PHP中常用的字符串格式化函数总结

    注意:在PHP中提供的字符串函数处理的字符串,大部分都不是在原字符串上修改,而是返回一个格式化后的新字符串. 一.取出空格和字符串填补函数 空格也是一个有效的字符,在字符串中也会占据一个位置.用户在表 ...