.NET中异常与错误码优劣势对比

时间:2021-12-27 01:40:09

  .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. [deviceone开发]-openPage的动画效果示例

    一.简介do_App的openPage支持16种过场动画,这个示例直观的展示16种动画的效果.适合初学者.二.效果图三.相关下载https://github.com/do-project/code4d ...

  2. java判断文件是否存在

    1.判断远程服务器上文件 import java.net.HttpURLConnection; import java.net.URL; public boolean checkRemoteFile( ...

  3. 测试一个域名DNS查询时间的shell脚本

    脚本内容: #!/bin/bash #目标域名 site=${site:-www.ptesting.com} for((i=1;i<=10000;i++)) do     #COUNTER='e ...

  4. C&num;中的cookie编程

    Cookie就是所谓的" 小甜饼" ,他最早出现是在Netscape Navigator 2.0中.Cookie其实就是由Web服务器创建的.将信息存储在计算机上的文件.那么为什么 ...

  5. 手机时间选择插件 Jquery

    // 时间选择 var currYear = (new Date()).getFullYear() var opt_data = { preset: 'date', //日期 theme: 'andr ...

  6. &lbrack;0&rsqb; C&num;软件项目版本号的命名规则及格式介绍

    版本控制比较普遍的 3 种命名格式 : 一.GNU 风格的版本号命名格式 : 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]] 英文对照 : Major_Version_Number. ...

  7. python学习日记(OOP访问限制)

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以*地修改一个实例的na ...

  8. &lt&semi;&lt&semi;linux device driver&comma;third edition&gt&semi;&gt&semi; Chapter 4&colon;Debugging Techniques

    Debugging by Printing printk lets you classify messages accoring to their severity by associating di ...

  9. ID3和C4&period;5分类决策树算法 - 数据挖掘算法(7)

    (2017-05-18 银河统计) 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来判断其可行性的决策分析方法,是直观运用概率分析的一种图解法.由于这种决策分支画 ...

  10. Java—网络编程基础

    URL的应用: 获得网页源代码可以用字节流.字符流,流的获取可以用url.openStream(),也可以用con.getInputStream(): 字节流: URL url = new URL(& ...