CLR 4.0有哪些新东西? -- 状态错乱异常 Corrupted state Exception

简介: 状态错乱异常Corrupted state Exception 根据评论, 又去看了更多的英文资料. 对此文进行了修改. 感谢大家的意见. 有人叫它超级异常. 指的是操作系统提出的未捕获异常, 例如: Access Violation Exception, Invalid Memory Exception, 等等.

状态错乱异常Corrupted state Exception

根据评论, 又去看了更多的英文资料. 对此文进行了修改. 感谢大家的意见.

有人叫它超级异常. 指的是操作系统提出的未捕获异常, 例如: Access Violation Exception, Invalid Memory Exception, 等等. 处理不当, 会打乱程序的状态, 引起程序崩溃, 或者导致不想看到的程序行为, 如同神经错乱. CLR4.0针对状态错乱异常做了一种可配置的处理机制. 请看下面的程序. 在以前的CLR里, 这个catch (Exception ex) 将所有可能发生的异常(包括状态错乱异常)都捕获. 在CLR4.0里, 默认情况下CLR4.0不会将操作系统提出的异常提交给托管代码. 因此默认情况下, 这个超级catch不会遇到状态错乱异常, 其它由CLR引发的异常还是可以捕获的.

class Program
{
    static void Main(string[] args)
    {
        SaveFile("file.txt");
        Console.ReadLine();
    }
    public static void SaveFile(string fileName)
    {
        try
        {
            FileStream fs = new FileStream(fileName, FileMode.Create);
        }
        catch (Exception ex)
        {
            Console.WriteLine("File open error");
            throw new IOException();
        }
    }
}
因为存在某些特殊情况, 需要改变默认的策略. CLR 4.0提供了两种定制的手段
[HandleProcessCorruptedStateExceptions]方法标注(Method attribute)
在需要超级catch的方法前面加上这个标注.就可以让超级catch也能捕获状态错乱异常, 入下:
[HandleProcessCorruptedStateExceptions]
public static void SaveFile(string fileName)
{
    try
    {
        FileStream fs = new FileStream(fileName, FileMode.Create);
    }
    catch (Exception ex)
    {
        Console.WriteLine("File open error");
        throw new IOException();
    }
}
注:这个方式只能在此方法内生效. 在其它地方还是按CLR4.0的默认方式处理.  
config配置文件
如果想在整个应用级改变这个策略, 就在config配置文件中写上
<?xml version="1.0"?>
<configuration>

  <runtime>
    <legacyCorruptedStateExceptionsPolicy enabled="true"/>
  </runtime>
</configuration>

参考资料:
http://eknowledger.spaces.live.com/blog/cns!F475D4DE444DB1AB!3256.entry
http://msdn.microsoft.com/en-us/magazine/cc793966.aspx
http://msdn.microsoft.com/en-us/magazine/dd419661.aspx
http://geekswithblogs.net/sdorman/archive/2008/11/07/clr-4.0-corrupting-state-exceptions.aspx

目录
相关文章
接口返回aop.unknow-error,系统繁忙
创建门店返回aop.unknow-error,大多数是因为传入的门店详细地址、店铺经纬度、省市区号指向的不是同一个地点而造成的,出现此类问题时,ISV需要首先核对上述地址是否指向相同地方,经纬度是否填反,是否没有使用高德坐标系,省市区号是否不是国标,是否填错。
1239 0
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”线程它。”
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”线程它。”
542 0
|
开发工具 Android开发
解决bug:运行项目时报异常 “Can't create handler inside thread that has not called Looper.prepare()”
解决bug:运行项目时报异常 “Can't create handler inside thread that has not called Looper.prepare()”
1226 0
|
5月前
|
关系型数据库 MySQL Java
异常:no transaction is in progress
异常:no transaction is in progress
143 0
|
Oracle 关系型数据库
impdp导入卡住,等待事件wait for unread message on broadcast channel
impdp导入卡住,等待事件wait for unread message on broadcast channel
2517 0
|
供应链
SAP LSMW 事务代码HUPAST的录屏后台执行报错 - Runtime error RAISE_EXCEPTION has occurred - 之分析
SAP LSMW 事务代码HUPAST的录屏后台执行报错 - Runtime error RAISE_EXCEPTION has occurred - 之分析
SAP LSMW 事务代码HUPAST的录屏后台执行报错 - Runtime error RAISE_EXCEPTION has occurred - 之分析
巧用Response.Write(message)中止异常
public void ResponseInfo(string message) { HttpContext.Current.Response.Clear(); HttpContext.
1052 0
|
数据采集 网络协议
一次TIME_WAIT和CLOSE_WAIT故障和解决办法
昨天解决了一个curl调用错误导致的服务器异常,具体过程如下: 里头的分析过程有提到,通过查看服务器网络状态检测到服务器有大量的CLOSE_WAIT的状态。   在服务器的日常维护过程中,会经常用到下面的命令:   它会显示例如下面的信息: TIME_WAIT 814CLOSE_WAIT 1FIN_WAIT1 1ESTABLISHED 634SYN_RECV 2LAST_ACK 1 常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。
2707 0
|
数据库
队列读取器代理 遇到错误 Row handle is invalid
原文:队列读取器代理 遇到错误 Row handle is invalid 今天测试在发布中更改表名称,在发布数据库更改后重新发布这个表。 但是原来的表在订阅没有删除,不小心插入数据到原表中,队列读取器停止并报错。
1169 0