第 7 章:异常

  异常与各种面向对象语言集成得非常好。

  异常增强了 API 的一致性。

  在用返回值来报告错误时,错误处理的代码与可能会发生错误的代码距离总是很近。

  更容易使错误处理的带码全局化。

  错误码很容易被忽略,而且经常会被忽略。

  异常可以包含丰富的信息来对错误的原因加以描述。

  异常允许用户定义未处理异常的处理程序。

  异常可以包含丰富的信息来对错误额原因加以描述。

  异常允许用户定义未处理异常的处理程序。

  异常有助于检测。

7.1 抛出异常

  不要返回错误码。

  要通过抛出异常的放回来报告操作失败。

  考虑在代码遇到严重问题且无法继续安全地执行时,通过调用 System.Environment.FailFast 来终止进程,而不要抛出异常。

  不要在正常的控制流中使用异常,如果能够避免的话。

  考虑抛出异常可能会对性能造成的影响。对大多数的应用程序来说,每秒抛出 100 个异常很可能会严重地影响性能。  

  要为所有的异常撰写文档,并把它们作为契约的一部分 - 如果异常是因为在调用公有成员时违反了它的契约而抛出的(非系统失败)。

  不要让公有成员根据某个选项来决定是否抛出异常。

  不要把异常用作公有成员的返回值或输出参数。

  考虑使用辅助方法来创建异常。

  不要在异常过滤程序中抛出异常。

  避免显式地从 finally 代码块中抛出异常。隐式地抛出异常,即在调用其它方法时由其它方法抛出异常,是可以接受的。

 

7.2 为抛出的异常选择合适的类型

  不要为了通报使用错误而创建新的异常类型。在这种情况下应该抛出框架中已有的异常。

  考虑为程序错误创建并抛出自定义的异常 - 如果对它的处理方式和对其它异常的处理方式有所不同。否则,应该抛出已有的异常。

  不要创建新的异常类型 - 如果对该错误的处理和对框架中已有异常的并没有什么不同。在这种情况下应该抛出框架中已有的异常。

  要创建新的异常类型来传达独一无二的程序错误 - 如果不能通过框架中已有的异常来传达该错误。

  避免设计出会导致系统失败的 API。如果此类失败可能会发生,那么在发生系统失败时应该调用 Environment.FailFast,而不应该抛出异常。

  不要仅仅为了拥有自己的异常而创建并使用新的异常。

  要使用合理的、最具针对性(最底层派生类)的异常。

  要在抛出异常时为开发人员提供丰富而有意义的错误消息。

  要确保异常消息的语法正确无误。

  要确保异常消息中的每个句子都有句号。

  避免在异常消息这种使用问号和惊叹号。

  不要在没有得到许可的情况下在异常消息中泄漏安全消息。

  考虑把组件抛出的异常消息本地化 - 如果想让沐浴为其它语言的开发人员也能使用组件。

  不要在框架的代码捕获具体类型不确定的异常(比如 System.Exception、System.SystemException,等等)时,把错误吞了。

  避免在应用程序的代码中,在捕获具体类型不确定的异常(比如 System.Exception、System.SystemException,等等)时,把错误吞了。

  不要把任何特殊的异常排除在外 - 如果编写 catch 代码块的目的就是为了转移异常。

  考虑捕获特定类型的异常 - 如果确实理解该异常在具体环境中产生的原因,并能对错误做出适当的反应。

  不要捕获不应该捕获的异常。通常应该允许异常沿着调用栈向上游传递。

  要在进行清理工作时使用 try-finally,避免使用 try-catch。对精心编写的异常代码来说,try-finally 的使用频率要比 try-catch 高得多。

  要在捕获并重新抛出异常时使用空的 throw 语句。这是保持异常调用栈不变的最好方法。

  不要用无参数的 catch 块来处理不符合 CLS 规范的异常(不是派生自 System.Exception 的异常)。

  考虑对较低层次抛出的异常进行适当地封装 - 如果较低层次的异常在较高层次的运行环境中没有什么意义。

  避免捕获并封装具体类型不确定的异常。

  要在对异常进行封装时为其指定内部异常。

7.3 标准异常类型的使用

  不要抛出 System.Exception 或 System.SystemExceptio 异常。

  不要在框架代码中捕获 System.Exception 或 System.SystemException 异常,除非打算重新抛出。

  避免捕获 System.Exception 或 Systen.SystemException 异常,除非是在顶层的异常处理器中。

  不要抛出 System.ApplicationException 或从它派生新类。

  要抛出 InvalidaOperationException 异常 - 如果对象处于不正确的状态。

  要在用户传入无效参数时抛出 ArgumentException 异常或其子类型。如果可以的话,要尽量使用位于继承层次末尾的异常类型。

  要在抛出 ArgumentException 异常或其子类时设置 ParamName 属性。

  要在属性的 setter 中,以 value 作为 value 隐式参数的名字。

  不要让公共 API 显式地或隐式地抛出 NullReferenceException、AccessViolationException 或 IndexOutOfRangeException 异常。这些异常时专门留给执行引擎来抛出的,大多数情况下它们表示代码存在缺陷。

  不要显式地抛出 StackOverflowException 异常。应该只有 CLR 才能显式地抛出该异常。

  不要捕获 StackOverflowException 异常。

  不要显式地抛出 OutOfMemoryException 异常。应该只有 CLR 才能抛出异常。

  不要显示地抛出 ComException、ExecutingEngineException 及 SEHException 异常,应该只有 CLR 才能抛出这些异常。

7.4 自定义异常的设计

  要从 System.Exception 或其它常用的异常基类派生新的异常。

  避免太深的继承层次。

  要在命名异常类时使用“Exception”后缀。

  要使异常可序列化。为了使异常能够在跨应用程序域和跨远程边界时仍能正常使用,这样做是必须的。

  要为所有的异常(至少)提供下面这些常用的构造函数。

  要通过 ToString 的一个覆盖方法来报告与安全性有关的消息,前提是必须先获得相应的许可。

  要把与安全性有关的信息保存在私有的异常状态中,并确保只有可信赖的代码才能得到该信息。

  考虑为异常定义属性,这样就能从程序中取得除了消息字符串之外与异常有关的额外信息。

  

7.5 异常与性能

  不要因异常可能对性能造成负面影响而使用错误码。

  考虑在成员中使用 Tester-Doer 模式来避免因异常而引起的性能问题 - 如果成员在常用场景中都可能抛出异常。

  考虑在成员中使用 Try-Parse 模式来避免因异常而引起的性能问题,如果成员在常用代码中都可能会抛出异常。

  要在实现 Try-Parse 模式时使用“Try”前缀,并用布尔类型作为方法的返回类型。

  要为每个使用 Try-Parse 模式的方法提供一个会抛出异常的对应成员。

  

《.NET 设计规范》第 7 章:异常的更多相关文章

  1. [Effective Java]第九章 异常

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. 《深入Java虚拟机学习笔记》- 第17章 异常

    <深入Java虚拟机学习笔记>- 第17章 异常

  3. [core java学习笔记][第十一章异常断言日志调试]

    第11章 异常,断言,日志,调试 处理错误 捕获异常 使用异常机制的技巧 使用断言 日志 测试技巧 GUI程序排错技巧 使用调试器 11.1 处理错误 11.1.1异常分类 都继承自Throwable ...

  4. Java核心技术卷一基础知识-第11章-异常、断言、日志和调试-读书笔记

    第11章 异常.断言.日志和调试 本章内容: * 处理错误 * 捕获异常 * 使用异常机制的技巧 * 使用断言 * 日志 * 调试技巧 * GUI程序排错技巧 * 使用调试器 11.1 处理错误 如果 ...

  5. 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理

    <C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...

  6. 【马克-to-win】学习笔记—— 第五章 异常Exception

    第五章 异常Exception [学习笔记] [参考:JDK中文(类 Exception)] java.lang.Object java.lang.Throwable java.lang.Except ...

  7. 【译】x86程序员手册31- 第9章 异常和中断

    Chapter 9 Exceptions and Interrupts 第9章 异常和中断 Interrupts and exceptions are special kinds of control ...

  8. 20190901 On Java8 第十五章 异常

    第十五章 异常 要想创建健壮的系统,它的每一个构件都必须是健壮的. 异常概念 C++的异常处理机制基于 Ada,Java 中的异常处理则建立在 C++的基础之上(尽管看上去更像 Object Pasc ...

  9. Java基础知识二次学习--第四章 异常

    第四章 异常处理   时间:2017年4月26日11:16:39~2017年4月26日11:28:58 章节:04章_01节 04章_02节 视频长度:20:46+01:16 内容:异常的概念 心得: ...

  10. 《python学习手册》第34章 异常对象

    基于字符串的异常 python在2.6之前可以使用字符串来定义异常,并且是通过对象标识符来匹配的(即通过is 而不是==) myexc = "My excetion string" ...

随机推荐

  1. C#初学者们,请离代码生成器远点!!!

    在程序开发的世界里,各路前辈们为了提高所谓的编码速度,搞出了各式各样的代码生成器,来避免所谓的重复的人为机械地粘贴和复制代码,以此来提高生产力. 早几年前,我可能会认为这样的做法真得有用,特别是在编码 ...

  2. FtpUtil.java测试 (淘淘商城第三课文件上传)

    首先在common-taotao中创建一个utils包,复制FtpUtil.java到其中.然后如下: @Test public void testFtpUtil() throws Exception ...

  3. 使用Eclipse在Excel中找出两张表中相同证件号而姓名或工号却出现不同的的项

    1:首先把Excel中的文本复制到txt中,复制如下: A表: 证件号                           工号  姓名 310110xxxx220130004 101 傅家宜3101 ...

  4. tomcat服务器一闪而过解决方法

    JDK没有配置,下载JDK安装到电脑上,然后在电脑->属性->高级系统设置->环境变量,将JDK中bin文件的目录E:\Program Files (x86)\Java\jre7\b ...

  5. 从零开始学习前端开发 — 17、CSS3背景与渐变

    一.css3背景切割: background-clip:border-box|padding-box|content-box; 作用: 用来设置背景的可见区域 a) border-box 默认值,背景 ...

  6. 坑爹的file_exists

       介绍   我发现了一个问题,今天与大家分享.我把整个过程描述一下.   问题   公司有个框架是基于smarty写的,我负责php的升级,维护人员把新环境布上来之后,测试人员找我提出经常报错(错 ...

  7. windows下安装redis3.2.100单机和集群详解

    下载redis 下载地址:https://github.com/MicrosoftArchive/redis/releases 我下载的是3.2.100版本的Redis-x64-3.2.100.zip ...

  8. ThinkPHP5上传图片并压缩为缩略图

    使用thinkphp开发app后端中,需要实现一个处理上传图片队列的功能 这是个上传多图片保存并且需要对其中一张图片进行压缩的功能 (使用的html5 mui框架开发app,如果直接载入原图,app客 ...

  9. asp.net -mvc框架复习(10)-基于三层架构与MVC搭建项目框架

    一.三种模式比较 1.MVC框架(适合大型项目) (1).V视图 (网页部分) (2).M模型 (业务逻辑+数据访问+实体类) (3).C控制器 (介于M和V之间,起到引导作用) 2.三层架构 (1) ...

  10. 【开发技术】java中代码检查checkStyle结果分析

    编写Javadoc代码在Java代码的类.函数.数据成员前中输入/**回车,Eclipse能够自动生成相应的Javadoc代码.可以在后面添加相关的文字说明. Type is missing a ja ...