艾伟_转载:.NET 4.0新特性-- Corrupted State Exceptions

  作为程序员,我想很多人应该都有过跟异常打交道的经历。而且相信也有很多人也都写过catch(Exception e){//blabla}这种把所有未知异常一股脑儿捕获并处理掉的代码吧。不管是为敷衍客户也好,让程序继续运行以避免糟糕的用户体验也罢,在微软眼中,这种处理方式都是不对的,特别是当你的程序是作为一个插件寄存在别的程序如VS,Offcie中时,这种情况下对有些严重的异常如访问冲突我们更应当是让程序结束而不是继续运行。

  然而很多时候,我们并不清楚哪些异常是严重的,哪些是可以让程序继续运行的,因为在.NET 4.0以前,CLR会很忠实的把所有大大小小的异常一股脑儿的都抛给程序员处理。不过这个问题在4.0以后会得到很好的解决了。因为对有些严重的会引起进程崩溃的异常的处理以后会由CLR来统一处理而不再交给我们可怜的程序员了。下面我将对这种异样处理做一些简单的介绍。

  为什么需要Corrupted State Exceptions

  异常有大有小,小的如字符串为空,这些一般是用户输入问题,它不会引起整个程序或者系统中相关进程出现崩溃的情况;大的如访问冲突异常,这可能是你的程序在做一些可能会引起操作系统崩溃的事情,这种异常一般都比较严重,一般如果出现这种异常,通常程序应该做的是结束当前进程,然后老老实实向用户报告你犯傻了并提示他重启程序。不过在.NET 4.0以前,CLR是很相信程序员不会搞出一些诸如catch(Exception e){return;}这种不负责任的代码的,因此它不分轻重缓急,只要是异常,它统统都会抛出来,这里面不仅仅有托管代码的异常,也有一些.NET程序员不太好看懂的COM和WIN32异常。CLR相信程序员在捕获异常的时候会只处理他们清楚的异常,但很多时候,作为开发人员,由于上面有老板,下面有客户,我们真的很难做人,想想如果老板动不动就听又客户抱怨他们只不过点了两下按钮程序就报错然后结束了,他还能给你加薪么?虽然很多时候我们清楚我们的代码不会出问题,但我们很难保证天时地利人和样样俱全,为了给老板和客户一个交代,这时候很多人都会选择去捕获所有的异常,然后记录下异常信息,然后程序继续彪悍的跑下去。

  看似一些都很完美,客户不会再像以前那么频繁的抱怨程序down掉,老板也就高兴了。但有人不高兴。小的未知异常当然不会捅大的篓子,但对有些可能导致程序甚至操作系统崩溃的异常如果不中断程序的话可能影响的就是一大片了。这个时候客户可能不会抱怨你,但他会抱怨微软出了个烂操作系统,一天到晚蓝屏,或者他会抱怨微软的Office或者IE太烂,他只不过加载了一个插件,结果整个Outlook就报错崩掉了。你是省事了,但微软得来被黑锅,而且他还不知道这个黑锅里面到底是咋回事。

  当然上面是玩笑,不过不管怎样,从程序安全和稳定的角度来看catch(Exception e)确实不是一个好的编程习惯,然而木已成舟,既然无法避免程序员偷懒,微软只能采取一些补救措施了,这里他们在CLR 4中添加了新的异常处理机制,自4.0以后,CLR不会主动给你抛出所有异常了,对于那些它认为是危险的,可能导致进程崩溃的异常它会标记为Corrupted State Exception并自己处理掉而不是抛给程序员来做,如AccessViolationException这种继承自SystemException的异常就会被当做Corrupted State Exception来处理。不过这里要注意的是,仅仅异常类型是可能会危险级别的异常还不够,CLR还会判断抛出异常的所有者,如果它发现是由操作系统抛出的访问冲突则会认为这是状态崩溃异常,但如果异常是由用户代码抛出,则CLR不会对其做特殊处理,它仍然会像以前一样将其正常抛出。

 如何继续捕获Corrupted State Exceptions

  那么CLR包了这块的异常处理是不是意味着以后我们程序员就没得选只能老老实实向用户报告我们的产品不行,然后让老板炒我们鱿鱼了呢?那些.NET 4.0以前发布的,处处是漏洞的产品我们怎么处理?

  虽然微软不再那么相信程序员是负责人的人,但它也做那么绝。虽然默认.NET 4.0以后CLR会处理这些异常,程序员也不用再操心这些危险的异常了。但你仍然可以继续你以往敷衍上司的做法。并且微软还提供了两种方式。

  首先对于以往的程序,微软提供了两种选择:

  1. 如果你想把以往旧的代码在.NET Framework 4.0下编译但又不想改代码的话,你可以在你的程序的配置文件中添加一个新的节点:legacyCorruptedState­­ExceptionsPolicy=true,它使得你的代码仍能按照以前处理异常的方式来继续运行。

  2. 如果你不想有任何改变,直接把以前已经编译好的程序在.NET Framework 4.0下运行则不需要任何改变,CLR会保证所有的异常仍然按照以往的方式处理。

  其次,对于那些使用了.NET Framework 4.0 但又想自己处理这些导致程序状态崩溃的异常,微软同样提供了选择,他们在.NET 4.0中增加了一个新的命名空间:System.Runtime.ExceptionServices,这里面有个特性类叫做HandleProcessCorruptedStateExceptionsAttribute,你只需要在相应方法上添加这个属性,CLR就会把所有的异常处理交给你做,就像以前一样。e.g.

代码
// This program runs as part of an automated test system so you need
// to prevent the normal Unhandled Exception behavior (Watson dialog).
// Instead, print out any exceptions and exit with an error code.
[HandledProcessCorruptedStateExceptions]
public static int Main()
{
try
{
// Catch any exceptions leaking out of the program
CallMainProgramLoop();
}
catch (Exception e) // We could be catching anything here
{
// The exception we caught could have been a program error
// or something much more serious. Regardless, we know that
// something is not right. We'll just output the exception
// and exit with an error. We won't try to do any work when
// the program or process is in an unknown state!
System.Console.WriteLine(e.Message);
return 1;
}
return 0;
}
//当然要注意的是这个特性只能应用在方法上。

  总结

  异常处理常常是程序员心中的一块心病,尽管微软认为自己得为纵容程序员滥用异常捕获负责然后添加了这个新的异常处理机制,不过在他们看来,那种catch(Exception e)的行为仍然是不对的。他们认为异常的出现表明当前程序的状态出现了问题,而程序员应当清楚这些错误的状态所造成的后果,所以程序员应当捕获具体的异常并作出正确的处理,而不是因为偷懒或者省事去简单处理所有异常。

  参考资料:

  Handling Corrupted State Exceptions        作者:Andrew Pardoe     

  原文地址:http://msdn.microsoft.com/en-us/magazine/dd419661.aspx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

艾伟_转载:使用Lambda表达式编写递归函数

前言 著名的牛顿同学曾经说过:如果说我比别人看得更远些,那是因为我站在了巨人的肩上. 原文:If I have been able to see further, it was only because I stood on the shoulders of giants. Whats Lambda表达式? 请参考msdn:Lambda 表达式…

腾讯测试鸿蒙系统,爆料:荣耀 30 Pro已开始测试华为鸿蒙系统

某数码博主今日放出了一张华为内部关于荣耀 30 Pro 测试 HarmonyOS 的截图,图片显示该机正运行基于 HarmonyOS 2.0 开发者测试版的系统。此外,他还透露荣耀 30 系列、V30 系列、Play4 Pro 下个月将升级到华为鸿蒙系统。华为在 2019 年开发者大会上正式推…

html多行文本框下拉,html基础-表单控件、密码框、单选按钮、复选框、多行文本框、下拉列表、按钮(提交、图片、重置)...

表单的介绍(将前端页面表单的值发送给后台,后台通过表单中name属性取值)可以获取客户端的信息(数据),表单有各种各样的控件,输入框,复选框 按钮等表单的功能:交互功能表单的工作原理:浏览有表单的页面&…

Lync Server 2010的部署系列_第七章 部署边缘服务器(上)

一、配置边缘支持的内部DNS记录 1) 登录DC.Gianthard.com(192.168.1.11)。在相应的 DNS 服务器上,依次单击“开始”、“控制面板”、“管理工具”,然后单击“DNS”。 2) 在 SIP 域的控制台树中,展开“正向查找区域”&a…

html5 txt文件上传,JavaScript html5利用FileReader实现上传功能

本文实例为大家分享了H5利用FileReader上传文件的具体代码,供大家参考,具体内容如下1. Html部分文件上传演练Browse...2. JS部分var result document.getElementById("result");var input document.getElementById("file_input");…

一起谈.NET技术,ASP.NET 请求处理流程

HTTP处理流程图 以上流程的一些概念解释: 1.http.sys 是一个位于Win2003和WinXP SP2中的操作系统核心组件,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯。 温馨提示:如果用户不慎删除了该驱动文件,不用…

链接在HTML的英文,英文:A链接标记ie下会自动补全href_HTML/Xhtml_网页制作

英文:A链接标记ie下会自动补全href.Whilst working on the Ajax Link Tracker and MapSurface I have come across an inconsistency in how the href attribute is retrieved using DOM Scripting.The href attribute is different to other element attributes in that the v…

python实现文件加密

前言: 想实现批量文件加密,可惜批量。展时没有思路 0x1 没有加密前的图片 加密后!!! !!!打不开了 0x02: 代码 import hashlibdef get_sha1(f):xdopen(E:/1.txt,rb).read() #以读二进…

教徒计划出品:升级ESXI41-ESXI5

这个文档是教徒计划“教徒第一期”学员做的升级ESX41到ESXI5的资料,以后教徒计划学员做的资料共享时,我都会打上“教徒计划出品”字样,这样有别于“现任明教教主”出品。这样能够确认是谁主导做的这个事情。“教徒计划”这个平台能够给安全CC…

百度2011大会见闻:百度开始推出耀主页

9月2号是百度大会的日子&#xff0c;之前通过51CTO注册&#xff0c;获得了参会资格&#xff0c;感谢51CTO带来的机会&#xff0c;可以有幸到现场观看到百度总裁李彦宏的精彩演讲。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />…

单招计算机英语面试口语,英语面试口语对话技巧:教育背景

2021年高职单招升学一对一咨询高职单招袁老师:16623303056(微信)英语面试口语对话技巧:教育背景一、常见的英语面试对话1a&#xff1a;can you read and write english and german?你能用英语和德语读写吗&#xff1f;b&#xff1a;no, im proficient in both written and spo…

Bootstrap-CSS:表格

ylbtech-Bootstrap-CSS&#xff1a;表格1.返回顶部 1、Bootstrap 表格 Bootstrap 提供了一个清晰的创建表格的布局。下表列出了 Bootstrap 支持的一些表格元素&#xff1a; 标签描述<table>为表格添加基础样式。<thead>表格标题行的容器元素&#xff08;<tr>…

Missing artifact net.sf.json-lib:json-lib:jar:2.4错误和Eclipse安装Maven插件错误

微信公众号&#xff1a;compassblog 欢迎关注、转发&#xff0c;互相学习&#xff0c;共同进步&#xff01; 有任何问题&#xff0c;请后台留言联系&#xff01; 1、配置Maven项目的pom.xml文件报错 &#xff08;1&#xff09;、错误描述&#xff1a;Missing artifact net.sf.j…

web前端【补充】CSS补充

css常用的一些属性&#xff1a; 1.去掉下划线 &#xff1a;text-decoration:none ;2.加上下划线&#xff1a; text-decoration: underline; 3.调整文本和图片的位置&#xff08;也就是设置元素的垂直对齐方式&#xff09;&#xff1a;vertical-align:-20px; 没设置之前&#xf…

XNA游戏:Hello XNA

下面创建一个简单的Windows Phone 7的XNA 程序&#xff0c;只是一个Hello XNA的文本&#xff0c;从屏幕的左上角一直往右下角移动&#xff0c;通过该例子来开始Windows Phone 7 XNA的游戏编程。 新建一个项目后可以看到这样的一个项目工程结构&#xff0c;如图所示。 Content项…

最快超级计算机神威,我国超算第一不保, 2018年最快超级计算机超神威太湖之光2倍...

原标题&#xff1a;我国超算第一不保, 2018年最快超级计算机超神威太湖之光2倍计算机的进化可以说是日新月异&#xff0c;去年的我国的神威太湖之光与天河二号分别为全球最快的大型计算机榜单第一和第二名。但是2018年新的超级计算机性能排名又出来了&#xff0c;这次我国的神威…

计算机怎么删除表格,电脑中删除Excel2010表格多余图片的三种方法

为了让表格看起来更加直观&#xff0c;很多朋友都会在Excel中插入图片。那么&#xff0c;当我们大批量插入图片时&#xff0c;如果想要删除的话&#xff0c;应该怎么办呢&#xff1f;以下是系统城小编为您带来的电脑中删除Excel2010表格多余图片的三种方法&#xff0c;希望对您…

C#设计模式--模板方法模式(学习Learning hard 设计模式笔记)

class Program{static void Main(string[] args){//创建一个菠菜实例并调用模板方法Spinach spinach new Spinach();spinach.CookVegetable();Thread.Sleep(5000);//创建一个白菜实例并调用模板方法ChineseCabbage chineseCabbage new ChineseCabbage();chineseCabbage.CookV…

tl_war302虚拟服务器,tl-war302设置教程

tl-war302设置教程[2021-02-16 17:51:52] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1a;《…

游侠联机显示无法链接服务器,我的世界用游侠联机时连接不上

2014-04-14我的世界怎么联机时转账我的世界联机教程&#xff1a;Minecraft联机教程日期&#xff1a;2012年01月13日 10:46 来源&#xff1a; 766单机游戏 核心提示&#xff1a;我的世界联机教程&#xff1a;Minecraft联机教程 第一步&#xff0c;下载联机版&#xff01;&#x…