.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中异常与错误码优劣势对比的更多相关文章

  1. [2017-08-28]Abp系列——业务异常与错误码设计及提示语的本地化

    本系列目录:Abp介绍和经验分享-目录 前言 ABP中有个异常UserFriendlyException经常被使用,但是它所在的命名空间是Abp.UI,总觉得和展现层联系过于紧密,在AppServic ...

  2. 使用whistle模拟cgi接口异常:错误码、502、慢网速、超时

    绝大多数程序只考虑了接口正常工作的场景,而用户在使用我们的产品时遇到的各类异常,全都丢在看似 ok 的 try catch 中.如果没有做好异常的兼容和兜底处理,会极大的影响用户体验,严重的还会带来安 ...

  3. 初学Servlet在IDEA中遇到的错误码问题

    1.跳转页面出现500状态码 调试时出现如图所示报错: 需要进入Project Structure中进行如下操作: 点击Apply后导入,解决500问题 2.出现404状态码 一般是路径有错误或拼写错 ...

  4. C++异常 返回错误码

    一种比异常终止更灵活的方法是,使用函数的返回值来指出问题.例如,ostream类的get(void)成员ASCII码,但到达文件尾时,将返回特殊值EOF.对hmean()来说,这种方法不管用.任何树脂 ...

  5. ETL的两种架构——ETL架构和ELT架构优劣势对比

    ​ 导读: 作为现代企业和组织机构的重要资源,信息是进行科学管理与决策分析的基础.ETL 则是把数据转换为信息.知识的关键步骤之一.在 AI 应用场景下,数据集成有哪些特点?随着 AI 应用场景越来越 ...

  6. 10.Redis的RDB和AOF两种持久化机制的优劣势对比

    1.RDB和AOF两种持久化机制的介绍 2.RDB持久化机制的优点3.RDB持久化机制的缺点4.AOF持久化机制的优点5.AOF持久化机制的缺点6.RDB和AOF到底该如何选择 我们已经知道对于一个企 ...

  7. CMPP错误码说明

    与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zzzzSMSC返回状态报告的状态值为DELETEDMK:zzzzSMSC返回状态报告的状态值为UNDEL ...

  8. 转!!CMPP 网关错误码说明

    http://www.163duanxin.com/msg/1753.htm CMPP错误码说明   与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zz ...

  9. Android项目实战(五十六):获取WebView加载的url的请求错误码

    例如需求,我有一个WebView 加载一个url, 该url对应的网页本身自带下拉刷新 ,但是网页本身会有出现400 500 等异常请求错误码 这时候网页加载失败,页面本身的下拉是无法使用的,要求重新 ...

随机推荐

  1. Spring batch学习 (1)

    Spring Batch 批处理框架 埃森哲和Spring Source研发 主要解决批处理数据的问题,包含并行处理,事务处理机制等.具有健壮性 可扩展,和自带的监控功能,并且支持断点和重发.让程序员 ...

  2. js 各种距离

    网页可见区域宽  document.body.clientWidth  网页可见区域高  document.body.clientHeight  网页可见区域宽(包括边线的宽)  document.b ...

  3. vb.net 与 c# 运算符区别

    vb.net vs c# 详细的Operators运算符区别 vb.net ===================== Comparison = < > <= >= <& ...

  4. Jboss:The LogManager was not properly installed (you must set the "java.util.logging.manager" system prop

    可能是jboss的服务器版本选择不对 ,比如我本地的Jboss服务器版本是  jboss-as-web-7.0.2.Final,选择的服务器版本是JBOOS  V7.1  Runtime ,就会报上面 ...

  5. springmvc+mybaits一个事物同时update和调用存储过程异常回滚

    事物作用的impl类这样写的 @Override public int updateReturnAll(int item, int status, int idUser) { // TODO Auto ...

  6. jdeveloper12.1.3的安装与卸载

    jdeveloper12.1.3的安装步骤:1>安装jdk7.0 2>在命令行中输入:cd C:\Program Files\Java\jdk1.7.0_60\bin 3>命令行安装 ...

  7. JetBrains全家桶激活地址

    全家桶地址:https://www.jetbrains.com/products.html?fromMenu JetBrains 授权服务器(License Server URL):http://id ...

  8. Ubuntu下U盘只读文件系统,图标上锁,提示无法修改

    资料来源于网络,自己总结 问题 Ubuntu下有时候插入U盘,发现不能修改其中的内容.例如不能新建文件和文件夹,不能向U盘中复制文件等,系统提示:只读文件系统. 原因大概是U盘的文件系统信息出错(保存 ...

  9. python virtualenv环境安装(ubuntu)

    测试系统ubantu16.04 该系统已经默认安装了python3.5, 当然了python2.7也同时存在着. 可以用如下命令安装pip(如下命令会默认安装pip到python2.7库中) $ su ...

  10. ps 中添加一张图片

    // 测试打开一个文件var fileref = new File ("/E/work/没有图片提交/2014/2014.5.19/G20/部件渲染测试/png/tianji_1-41001 ...