`
t641339564
  • 浏览: 27536 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

第6章 异常

阅读更多

设计异常的唯一目的是报告错误。

6.1. 抛出异常

û 不要返回错误码。

 

ü 要通过抛出异常的方式来报告操作失败。

 

ü 考虑通过调用System.Environment.FailFast来终止进程,而不是抛出异常,如果代码遇到了严重问题,已经无法继续安全的执行。

 

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

double a = 98, b = 0;

double result = 0;

try

{

result = SafeDivision(a, b);

Console.WriteLine("{0} divided by {1} = {2}", a, b, result);

}

catch (DivideByZeroException e)

{

//bad

result = SafeDivision(a, 2);

Console.WriteLine("Attempted divide by zero.");

}

Console.ReadKey();

 

ü 考虑抛出异常可能会对性能造成的影响。

 

ü 要为所有的异常撰写文档,并把它们作为协定的一部分,前提是这些异常是由于违反了公有成员的协定而抛出的。

 

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

static double SafeDivision(double x, double y,bool throwOnError)

{

//bad

if (y ==0)

{

if (throwOnError)

throw new System.DivideByZeroException("Attempted divide by zero.");

}

return x / y;

}

 

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

//bad

public Exception DoSomething() { }

 

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

static double SafeDivision(double x, double y)

{

if (y == 0)

ThrowNewDivideByZeroException();

return x / y;

}

static void ThrowNewDivideByZeroException()

{

string description = "Attempted divide by zero.";

throw new System.DivideByZeroException(description);

}

 

û 避免显示的从finally代码块中抛出异常。

finally

{

if (y == 0)

throw new System.DivideByZeroException();

Console.ReadLine();

}

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

ü 考虑优先使用System名字空间中已有的异常,而不是自己创建新的异常类型。

 

ü 如果对错误的处理方式或其他已有的异常有所不同,要使用自定义的异常类型。否则的话,应该使用已有的异常。

 

û 不要仅仅为了拥有自己的异常而创建并使用新的异常,要使用最合理,最有针对的异常。

try

{

object ObjPerson = null;

if (ObjPerson == null)

throw new ArgumentNullException();//good

throw new ArgumentException();//bad

Console.WriteLine(ObjPerson.ToString());

}

catch (ArgumentNullException e)

{

……….

}

 

6.2.1. 错误消息的设计

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

 

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

 

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

 

û 避免在异常消息中使用问号和惊叹号。

 

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

 

ü 考虑把组件抛出的异常消息本地化,如果希望组件为不同语言的开发人员所使用。

try

{

if (y == 0)

throw new System.DivideByZeroException("Attempted divide by zero.");

}

6.2.2. 异常处理

û 不要在框架的代码中,在捕获具体类型不确定的异常时,把错误吞了。

 

û 不要在转移异常而编写的catch代码块中把任何特殊的异常排除在外。

 

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

 

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

 

ü 要在进行清理工作时使用try-finally,避免使用try-catchcatch代码块是来从错误中恢复。Finally代码是来清理的。

 

ü 要在捕获并重新抛出异常是使用空的throw语句。

try

{

stream = new FileStream(......);

}

finally

{

if(stream != null) stream.Close();

}

 

û 不要用无参数的catch块来处理不符号CLS规范的异常。

6.2.3. 对异常进行封装

ü 考虑对较低层次抛出的异常进行适当的封装。

 

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

 

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

6.3. 标准异常类型的使用

6.3.1.ExceptionSystemException

û 不要抛出System.ExceptonSystem.SystemException异常。

 

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

 

û 避免捕获System.ExceptionSystem.SystemExcepton异常,除非是在顶层的异常处理器中。

catch(Exception e)

{

Console.Write(……);

throw;

}

6.3.2. ApplicationException

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

6.3.3. InvalidOperationException

ü 要抛出InvalidOperationException异常,如果对象处于不正确的状态。

6.3.4.ArgumentExceptionArgumentNullExceptionArgumentOutOfRangeException

ü 要抛出ArgumentException异常或其子类,如果传入的是无效参数。

 

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

 

ü 要在属性的设置方法中,以value作为隐式值参数的名字。

public string Name

{

set

{

if(value == null){

throw new ArgumentNullException("value", …);

}

}

}

6.3.5.NullReferenceExceptionIndexOutOfRangeExceptionAccessViolationException

û 不要让公用API显示的或隐式的抛出NullReferenceExceptionAccessViolatonExceptionIndexOutOfRangeException异常。

6.3.6. StackOverFlowExcetion

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

 

û 不要捕获StackOverflowException异常。

6.3.7. OutOfMemoryException

û 不要显示的抛出OutOfMemoryException异常。应该只有CLR才能抛出该异常。

6.3.8.ComExceptionSEHException及其他CLR异常

û 不要显示的抛出InteropException,ComExceptionSEHException异常。应该只有CLR才能抛出这些异常。

 

û 不要显示的捕获SEHExcepton异常。

6.3.9. ExecutionEngineException

û 不要显示的抛出ExecutionEngineException异常。

6.4. 自定义异常的设计

û 避免太深的继承层次。

 

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

 

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

 

ü 要使异常可序列化。为了使异常能够跨应用程序域。

 

ü 要为所有的异常提供下面常用的构造函数。

public class SomeException:Exception,ISerializable

{

Public SomeException();

Public SomeException(string message);

Public SomeException(string message,Exception inner);

Protected SomeException(SerializationInfo info,StreamingContext context);

}

ü 要把与安全性有关的信息保存在私有的异常状态中。

 

ü 考虑为异常定义属性。

6.5. 异常与性能

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

6.5.1. Tester–Doer模式

ü 考虑在方法中使用Tester-Doer模式来避免因异常而引起的性能问题。

ICollection<int> numbers= ...

if(!numbers.IsReadOnly)

{

numbers.Add(1);

}

用来对条件进行测试的成员称为tester,在前面的例子中就是IsReadOnly。用来执行实际的操作并可能会抛出异常的成员称为doer.在上例中就是Add方法。

 

6.5.2. Try-Parse模式

ü 考虑在方法中使用Try-Parse模式来避免因异常而引起的性能问题。

 

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

 

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

public struct DateTime

{

public static DateTime Parse(string dateTime){……}

public static bool TryParse(string dateTime,out DateTime result){…..}

}

 

分享到:
评论

相关推荐

    JAVA基础第6章异常处理机制_练习题_200910[借鉴].pdf

    JAVA基础第6章异常处理机制练习题 本资源是关于JAVA基础第6章异常处理机制的练习题,涵盖了异常处理机制的基本概念、try-catch-finally语句、throw和throws关键字、自定义异常类等知识点。 1. 异常处理机制的基本...

    Java程序设计:第六章 异常处理.ppt

    Java程序设计:第六章 异常处理.ppt

    第六章异常处理、递归和单体程序设计

    本章节以清华大学雍俊海编写的Java程序设计教程第三版为基础,详细介绍了这三个方面的知识,使读者能够理解和掌握Java异常处理机制、递归方法的设计技巧以及单体模式的设计模式。 在Java中,异常处理是指程序在运行...

    Python-3基础教程-第6章异常处理.ppt

    Python异常处理是编程实践中至关重要的一个环节,它允许程序员优雅地处理程序运行时可能出现的错误,从而提高程序的健壮性和用户体验。在Python 3中,异常处理通过`try-except`语句来实现,其核心思想是将可能出错的...

    完整版 Java开发实训课程系列-SpringMVC框架技术教程 第6章 异常处理 (共12页).pptx

    **SpringMVC框架中的异常处理**是Java开发中不可或缺的一部分,它确保了应用程序在遇到错误时能够优雅地处理并提供有用的反馈。在SpringMVC框架中,异常处理机制允许开发者集中处理可能出现的各种异常,提高代码的可...

    Java语言程序设计:第五章 异常.ppt

    六、try-catch-finally语句 try-catch-finally语句是捕获异常的一种方式。finally块中的代码将在try块和catch块执行完毕后执行,无论是否发生异常。 七、多重catch块 多重catch块可以捕获多种类型的异常。例如: ...

    异常处理和多线程

    【异常处理】 在Java编程中,异常处理是一种机制,用于在程序运行过程中处理可能出现的错误情况。异常是在程序执行期间遇到的不正常条件,可能导致程序的终止。Java中的异常分为两大类:错误(Error)和违例...

    第9章 异常.pptx

    根据提供的文件信息,本章主要围绕Python中的异常处理机制展开,包括异常的概念、常见的异常类型、如何处理异常、抛出异常以及自定义异常等内容。下面将对这些知识点进行详细的阐述。 ### 一、异常简介 在编程过程...

    第10章 异常处理机制(Exception).ppt

    本章主要围绕以下几个方面介绍Java的异常处理机制: 1. **异常与错误的区别**: 在Java中,异常和错误都是`java.lang.Throwable`类的子类。异常通常是程序运行时可以预见的问题,比如除以零、文件未找到等,可以...

    Visual Basic 2010 .NET 4高级编程(第6版)

    第Ⅰ部分 语言结构和环境 第1章 Visual Studio 2010 第2章 对象和Visual Basic 第3章 定制对象 第4章 公共语言运行库 第5章 用Visual Basic进行声明式编程 第6章 异常处理和调试 第7章 测试驱动的开发第Ⅱ部分 业务...

    Java第10章 异常处理含源代码

    本章重点讲解了Java中的异常处理,并提供了相关的源代码示例,以帮助开发者深入理解这一概念。 异常是程序运行过程中出现的非正常情况,如除以零、文件未找到、空指针引用等。Java使用异常处理来中断正常的代码流程...

    第一行代码Java源代码第6章课程代码异常的捕获及处理

    本资源“第一行代码Java源代码第6章课程代码异常的捕获及处理”正是针对这一主题进行深入讲解的教程,旨在帮助初学者理解并掌握Java中的异常处理机制。 Java异常处理通过五个关键字来实现:try、catch、finally、...

    第6章除法运算——异常处理.ppt

    本章重点介绍了如何通过Java语言的异常处理机制来优雅地处理这些问题。 首先,异常(Exception)是程序在执行过程中遇到的非正常情况,通常表现为错误或者意外的行为。在Java中,当发生异常时,程序不会立即停止,...

    Accp5.0 S1java第6章~第8章作业

    在本压缩包文件中,"Accp5.0 S1java第6章~第8章作业"涵盖了Java编程学习的三个重要章节。Accp5.0通常指的是北大青鸟APTECH的ACCP软件工程师培训课程的一个版本,该课程旨在为学员提供全面的Java编程技能。第6章至第8...

    Visual Basic 2010 .NET 4高级编程(第6版) PART1

    第Ⅰ部分 语言结构和环境 第1章 Visual Studio 2010 第2章 对象和Visual Basic 第3章 定制对象 第4章 公共语言运行库 第5章 用Visual Basic进行声明式编程 第6章 异常处理和调试 第7章 测试驱动的开发第Ⅱ部分 业务...

    Visual Basic 2010 .NET 4高级编程(第6版)PART2

    第Ⅰ部分 语言结构和环境 第1章 Visual Studio 2010 第2章 对象和Visual Basic 第3章 定制对象 第4章 公共语言运行库 第5章 用Visual Basic进行声明式编程 第6章 异常处理和调试 第7章 测试驱动的开发第Ⅱ部分 业务...

    Beginning WF 4.0

    第六章 异常处理 60 第七章 扩展内置的活动 68 第三部分 通讯 80 第八章 发送和接收 80 第九章 与宿主程序通信 103 第十章 工作流Web服务 129 第四部分 流程扩展 152 第十一章 SQL持久化 152 第十二章 扩展 164 第十...

    python入门学习资料

    第 6 章 异常和文件处理 第 7 章 正则表达式 第 8 章 HTML 处理 第 9 章 XML 处理 第 10 章 脚本和流 第 11 章 HTTP Web 服务 第 12 章 SOAP Web 服务 第 13 章 单元测试 第 14 章 测试优先编程 第 15 章 重构 第 16...

    Java程序设计基础篇(第8版)第六章编程题答案

    Java程序设计基础篇是学习Java编程的入门教材,其第六章通常涵盖了面向对象编程的核心概念。在这个章节中,学生会接触到类、对象、继承、封装和多态等关键概念。编程题是理解和掌握这些概念的重要实践环节。由于本书...

Global site tag (gtag.js) - Google Analytics