.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 等异常请求错误码 这时候网页加载失败,页面本身的下拉是无法使用的,要求重新 ...
随机推荐
- MYSQL, REDIS 等数据库的介绍
MySQL: 数据库概述 MySql安装和基本管理 MySQl创建用户和授权 初始mysql语句 库的操作 表的操作 数据类型 数据类型(2) 完整性约束 外键的变种 三种关系 数据的增删改 单表查询 ...
- selenium webdriver ——执行javascript代码
在代码中import org.openqa.selenium.JavascriptExecutor;就可以使用executeScript.executeAsyncScript这两个方法了 execut ...
- 搭建 redis 集群 (redis-cluster)
一 所需软件:Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb 二 安装配置redis redis下载地址 ...
- Visual Studio 使用Web Deploy发布项目
工具:Web Deploy 3.6 点击下载 (强烈推荐使用独立的Web Deploy 安装包安装) 使用 Web Platform Installer 安装 Web Deploy(3.5,3.6都安 ...
- LUA table.sort的问题,数组与表的区别
t = { [] = , [] = , [] = , [] = , } t1 = { , , , , } t2 = { 'a', 'b','d','c', } function cmp(v1, v2) ...
- Xpath解析xml
Xpath解析xml其实最主要的是查找xml文档中信息,而且不需要了解xml文档结构 package com.huawei.xml; import java.io.InputStream;import ...
- 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
实现EXCEL导入功能:web网站,excel导入用OLEDB同样会报错:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 报错信息: Exception caught. ...
- 学习 java 编程语言两个月来的感受
今天是我接触java编程的第81天, 现在的感受是觉得非常快乐, 每次看着自己的写的代码能成功运行的时候那种喜悦是无法言表的, 最初接触电脑还是在小学, 后来到了初中觉得电脑无非就是点点鼠标, 按按键 ...
- marioTcp
https://github.com/nicholaszj/marioTcp MarioTCP MarioTCP 是使用libevent模型来建立的一个性能强大的TCP服务器. 1:Getting S ...
- [Java] 通过XPath获取XML中某个节点的属性
/** * Get PA Url * @author jzhang6 * @return url */ public String getPAUrl(){ String PAUrl = "& ...