.NET中异常与错误码优劣势对比
.NET之所以选择异常,而不是返回错误码来报告异常,是由于前者有以下几个优势:
1、异常与oop语言的结合性更好。oop语言经常需要对成员签名强加限制,比如c#中的构造函数、操作符重载和属性,开发者对成员签名中的返回值没有选择余地,故想在oop中统一使用错误码来报告错误是不现实的,替代方案就是在这些特殊场景下使用错误码之外的错误报告机制,比如异常。这样一来,问题就转变为了是否应该在所有地方都使用异常,还是只在特殊场景下使用异常,而在其他情况下仍使用错误码,很明显,从对开发人员友好性方面考虑,始终使用一种机制来报告错误加强了一致性和易用性,故更好。
2、异常增强了API的一致性。这是由于异常的设计目的就是报告错误,相比之下,返回值就有多种用途,报告错误只是其中之一。故使用返回值报告错误可能存在多种模式报告错误,相反,异常则有着相对固定的模式(均是派生自Exception类的对象,均采用try...catch形式捕获)。win32 API就是这种不一致的一个典型的例子,它使用了BOOL、HRESULTS和GetLastError等。
3、错误码机制中,错误处理代码总是和发生错误的代码离得很近,而使用异常处理机制时,开发者有更多的选择余地,既可以在错误发生处捕获处理异常,也可以在调用栈的上游集中处理异常。
4、更容易使错误处理的代码局部化或集中化。在编写稳健的代码时,若用异常报告错误,几乎每一行功能性代码都需要一个if语句,这些if语句存在都目的就是为了处理错误。若改为使用异常,编写代码就容易许多,可以先执行一系列功能性操作,然后将错误处理代码集中放在try块之后,甚至是调用栈的上游。注意:虽说不应使用错误码报告异常,但是还是可以考虑在执行一个成功操作之后返回一些状态信息,比如用来向数据库插入数据的insert方法可以返回插入的记录条数。
5、错误码很容易被忽略且经常被忽略,相反,开发者则无法忽略通过异常机制报告的错误,这样就使得在代码测试期发现更多的缺陷,从而使得发行版更加稳健。
6、异常可以携带丰富的信息用以对错误的原因进行说明。
7、异常允许用户定义未处理异常的处理程序(handler)。理想情形下,一个应用应该能处理所有形式的错误,但这是不现实的,因为开发者不可能预判到所有情况。在使用错误码时,意料之外的错误经常被调用方忽略,程序进行运行并导致未定义的结果。相反,使用异常时,在发生意料之外的异常时,系统会调用未处理异常的handler。该handler既可以将失败记录下来,也可以选择关闭应用程序。与继续让应用运行并产生不确定的结果相比,这种做法显然更可取。
8、异常有助于检测分析(instruction)。异常是经过定义的方法失败模型(method-failure )。正因如此,各种工具(比如调试器,性能分析器、性能计数器等)可能会时刻注意异常的发生。例如,性能监视器(Performance Monitor)会追踪统计异常,而调试器则可以在发生异常时中断。错误码机制就无法享受这些好处。
参考资料:《.NET设计规范》
.NET中异常与错误码优劣势对比的更多相关文章
- [2017-08-28]Abp系列——业务异常与错误码设计及提示语的本地化
本系列目录:Abp介绍和经验分享-目录 前言 ABP中有个异常UserFriendlyException经常被使用,但是它所在的命名空间是Abp.UI,总觉得和展现层联系过于紧密,在AppServic ...
- 使用whistle模拟cgi接口异常:错误码、502、慢网速、超时
绝大多数程序只考虑了接口正常工作的场景,而用户在使用我们的产品时遇到的各类异常,全都丢在看似 ok 的 try catch 中.如果没有做好异常的兼容和兜底处理,会极大的影响用户体验,严重的还会带来安 ...
- 初学Servlet在IDEA中遇到的错误码问题
1.跳转页面出现500状态码 调试时出现如图所示报错: 需要进入Project Structure中进行如下操作: 点击Apply后导入,解决500问题 2.出现404状态码 一般是路径有错误或拼写错 ...
- C++异常 返回错误码
一种比异常终止更灵活的方法是,使用函数的返回值来指出问题.例如,ostream类的get(void)成员ASCII码,但到达文件尾时,将返回特殊值EOF.对hmean()来说,这种方法不管用.任何树脂 ...
- ETL的两种架构——ETL架构和ELT架构优劣势对比
导读: 作为现代企业和组织机构的重要资源,信息是进行科学管理与决策分析的基础.ETL 则是把数据转换为信息.知识的关键步骤之一.在 AI 应用场景下,数据集成有哪些特点?随着 AI 应用场景越来越 ...
- 10.Redis的RDB和AOF两种持久化机制的优劣势对比
1.RDB和AOF两种持久化机制的介绍 2.RDB持久化机制的优点3.RDB持久化机制的缺点4.AOF持久化机制的优点5.AOF持久化机制的缺点6.RDB和AOF到底该如何选择 我们已经知道对于一个企 ...
- CMPP错误码说明
与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zzzzSMSC返回状态报告的状态值为DELETEDMK:zzzzSMSC返回状态报告的状态值为UNDEL ...
- 转!!CMPP 网关错误码说明
http://www.163duanxin.com/msg/1753.htm CMPP错误码说明 与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zz ...
- Android项目实战(五十六):获取WebView加载的url的请求错误码
例如需求,我有一个WebView 加载一个url, 该url对应的网页本身自带下拉刷新 ,但是网页本身会有出现400 500 等异常请求错误码 这时候网页加载失败,页面本身的下拉是无法使用的,要求重新 ...
随机推荐
- kettle步骤概览--清洗校验
2017年03月22日 11:01:19 阅读数:4755 前边介绍了34个子程序 关于清洗和校验的子系统包含四个: 清洗.错误处理.审计维度.排重 Kettle里没有单一的数据清洗步骤,但有很多 ...
- Service Mesh扫盲
原文:http://www.infoq.com/cn/news/2017/12/why-service-mesh 摘要: 对 Service Mesh 的理解?它的出现最终是为了解决什么问题? Ser ...
- springcloud(四) ribbon和feign
Ribbon使用 order-service工程: application.yml: server: port: 9010 #order 服务都是用90 开头的端口 spring: applicati ...
- hadoop学习day1环境配置笔记(非完整流程)
hdfs的工作机制: 1.客户把一个文件存入hdfs,其实hdfs会把这个文件切块后,分散存储在N台linux机器系统中(负责存储文件块的角色:data node)<准确来说:切块的行为是由客户 ...
- 温故而知新-strtok函数
温故而知新-strtok函数 记得之前没见过这个函数,是把字符串分割成更小的字符串 来个例子就是比较鲜明了 $string = "Hello world. Beautiful day tod ...
- ES6系列_8之函数和数组
1.对象的函数解构 ES6为我们提供了这样的解构赋值使在前后端分离时,后端返回来JSON格式的数据,前端可以直接把这个JSON格式数据当作参数,传递到函数内部进行处理.比如: let json = { ...
- 用dwz时, 由于粗心产生的一些问题(记录方便自己查阅)
在打开"添加" 或 "修改" , 用dialog弹出时 , 点击提交的时候, dialog 不能关闭, 也不能刷新 解决办法: 注意form标签, onsubm ...
- 跟我学算法-svm支持向量机算法推导
Svm算法又称为支持向量机,是一种有监督的学习分类算法,目的是为了找到两个支持点,用来使得平面到达这两个支持点的距离最近. 通俗的说:找到一条直线,使得离该线最近的点与该线的距离最远. 我使用手写进行 ...
- Liunx cannot remove `xxx': Operation not permitted
链接: http://mangocool.com/detail_1_1439515930283.html 解到原来文件还可以设置隐藏权限,就是这个chattr设置,下面我们来看看这个命令的详解. [r ...
- OpenLayers3 学习-1
OpenLayers3 学习-1-简介 OpenLayers3(OL3)对OL2进行了重新设计和实现,支持多种格式的商业和免费的地图数据源.未来的版本将包括显示3D地图或利用WebGL进行大规模矢量数 ...