reference : http://www.cnblogs.com/luminji/archive/2010/10/20/1823536.html

本章概要:

1:为什么需要异常

2:finally

3:什么时候需要捕获异常

4:什么时候需要抛出异常

5:异常处理中的错误做法

6:为什么需要自定义异常

7:自定义异常的设计要素

8:什么时候不需要自定义异常

1:为什么需要异常

      利用异常处理,我们可以将资源清理代码放在一个固定的位置,并且确保它们得到执行。      利用异常处理,我们可以将异常处理的代码放在一个集中的位置。      异常处理的强制性,和前一个好处密切相关的可能是异常处理所带来的最大好处。      利用异常处理,我们可以很容易定位和修复代码中的bug。

2:finally

     即使发生异常也会执行 finally 块中的代码。使用 finally 块释放资源,例如,关闭在 try 块中打开的任何流或文件。     在 finally 块中关闭数据库连接是另一个不错的选择。 因为有时候数据库服务器允许的连接数是有限的,所以应尽快关闭数据库连接。 在由于引发了异常而无法关闭连接的情况下,使用 finally 块也是比等待垃圾回收更好的一种选择。

3:什么时候需要捕获异常

      当下列条件为真时,应该捕捉异常:      a、对引发异常的原因有具体的了解,并可实现特定的恢复,例如,捕捉 FileNotFoundException 对象并提示用户输入新的文件名。      b、可以新建一个更具体的异常并引发该异常。例如:

int GetInt(int[] array, int index)
{
try
{
return array[index];
}
catch(System.IndexOutOfRangeException e)
{
throw new System.ArgumentOutOfRangeException(
"Parameter index is out of range.");
}
}

c、部分处理异常。例如,可以使用 catch 块向错误日志中添加项,但随后重新引发该异常,以便对该异常进行后续处理。例如:

try
{
// try to access a resource
}
catch (System.UnauthorizedAccessException e)
{
LogError(e); // call a custom error logging procedure
throw e; // re-throw the error
}

4:什么时候需要抛出异常

a、方法无法完成其中定义的功能。          例如,如果方法的参数具有无效值:

static void CopyObject(SampleClass original)
{
if (original == null)
{
throw new System.ArgumentException("Parameter cannot be null", "original");
} }

b、根据对象的状态,对某个对象进行不适当的调用。      一个示例可能尝试对只读文件执行写操作。在对象状态不允许某项操作的情况下,引发 InvalidOperationException 的一个实例或基于此类的派生类的对象。以下为引发 InvalidOperationException 对象的方法的示例:

class ProgramLog
{
System.IO.FileStream logFile = null;
void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {} void WriteLog()
{
if (!this.logFile.CanWrite)
{
throw new System.InvalidOperationException("Logfile cannot be read-only");
}
// Else write data to the log and return.
}
}

c、方法的参数导致了异常。      在此情况下,应捕获原始异常并创建一个 ArgumentException 实例。原始异常应作为 InnerException 参数传递给ArgumentException 的构造函数:

static int GetValueFromArray(int[] array, int index)
{
try
{
return array[index];
}
catch (System.IndexOutOfRangeException ex)
{
System.ArgumentException argEx = new System.ArgumentException("Index is out of range", "index", ex);
throw argEx;
}
}

5:异常处理中的错误做法

      不要通过在框架代码中捕捉非特定异常(如 System.Exception、System.SystemException 等)来处理错误。      如果捕捉异常是为了再次引发或传输给其他线程,则可以捕捉这些异常。      不要显式引发 System.StackOverflowException。此异常仅应由公共语言运行时 (CLR) 显式引发。      不要捕捉 System.StackOverflowException。以编程方式处理堆栈溢出极为困难。应允许此异常终止进程并使用调试确定问题的根源。      不要显式引发 System.OutOfMemoryException。此异常仅应由 CLR 基础结构引发。      不要显式引发 System.Runtime.InteropServices.COMException 或 System.Runtime.InteropServices.SEHException。这些异常仅应由 CLR 基础结构引发。      不要显式捕捉 System.Runtime.InteropServices.SEHException。      不要显式引发 System.ExecutionEngineException。

6:为什么需要自定义异常

      如果要对某类程序出错信息作出特殊处理了,那就自定义异常。      方便调试,通过抛出一个我们自己定义的异常类型实例,我们可以使捕获代码精确地知道所发生的事情,并以合适的方式进行恢复。      逻辑包装,自定义异常可包装多个其它异常,然后抛出一个业务异常。      方便调用者编码,在编写自己的类库或者业务层代码的时候,自定义异常可以让调用方更方便处理业务异常逻辑。如保存数据失败,可以分成两个异常“数据库连接失败。”、“网络异常。”      引入新异常类,使程序员能够根据异常类在代码中采取不同的操作。

7:自定义异常的设计要素

异常类名称一定要以后缀 Exception 结尾。      一致的命名约定有助于降低新库的学习曲线。      应使异常可序列化。异常必须可序列化才能跨越应用程序域和远程处理边界正确工作。      一定要在所有异常上都提供(至少是这样)下列常见构造函数。确保参数的名称和类型与在下面的代码示例中使用的那些相同。

public class NewException : BaseException, ISerializable
{
public NewException()
{
// Add implementation.
}
public NewException(string message)
{
// Add implementation.
}
public NewException(string message, Exception inner)
{
// Add implementation.
} // This constructor is needed for serialization.
protected NewException(SerializationInfo info, StreamingContext context)
{
// Add implementation.
}
}

8:什么时候不需要自定义异常

考虑引发 System 命名空间中的现有异常,而不是创建自定义异常类型。      如果错误状态可以通过不同于现有任何其他异常的方法以编程方式进行处理,则要创建并引发自定义异常。否则,引发一个现有异常。      不要只是为了您所在的团队获得异常而创建和引发新异常。

练习:

1.You are working on a debug build of an application.    You need to find the line of code that caused an exception to be thrown. Which property of the Exception class should you use to achieve this goal?    A. Data B. Message C. StackTrace  D. Source

Answer: C

2.You write the following custom exception class named CustomException.       public class CustomException:ApplicationException{

public static int COR_E_ARGUMENT=unchecked((int)0x80070075);

public CustomException(string msg):base(msg) {HResult=COR_E_ARGUMENT;}

} You need to write a code segment that will use the CustomException class to immediately return control to the COM caller. You also need to ensure that the caller has access to the error code. Which code segment should you  use?

A. return Marshal.GetExceptionForHR(CustomException.COR_E_ARGUMENT); B. return CustomException.COR_E_ARGUMENT; C. Marshal.ThrowExceptionForHR(CustomException.COR_E_ARGUMENT);

D. throw new CustomException("Argument is out of bounds"); Answer: D

C#笔记1:异常的更多相关文章

  1. python学习笔记5_异常

    python学习笔记5_异常 1.什么事异常 Python使用异常对象(exception object) 来表示异常情况.遇到错误会发生异常. 如果异常对象未被处理或被捕捉,程序就会用所谓的回溯(t ...

  2. 笔记-python异常信息输出

    笔记-python异常信息输出 1.      异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...

  3. Windows内核读书笔记——Windows异常分发处理机制

    本篇读书笔记主要参考自<深入解析Windows操作系统>和<软件调试>这两本书. IDT是处理异常,实现操作系统与CPU的交互的关口. 系统在初始化阶段会去填写这个结构. ID ...

  4. 斯坦福机器学习视频笔记 Week9 异常检测和高斯混合模型 Anomaly Detection

    异常检测,广泛用于欺诈检测(例如“此信用卡被盗?”). 给定大量的数据点,我们有时可能想要找出哪些与平均值有显着差异. 例如,在制造中,我们可能想要检测缺陷或异常. 我们展示了如何使用高斯分布来建模数 ...

  5. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

  6. Java笔记:异常

    Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类. Exception 类是 Throwable 类的子类.除了Exception类外,Throwa ...

  7. Effective Java 读书笔记之八 异常

    一.只针对异常的情况才使用异常 1.类具有状态相关的方法时,可采用状态测试方法和可识别的返回值两个策略. 二.对可恢复的情况使用受检异常,对编程错误使用运行时异常 1.期望调用者能够适当恢复的情况,应 ...

  8. javase基础笔记4——异常/单例和类集框架

    继承 extends final关键 多态 是在继承的基础上 接口 interface 异常 exception 包的访问可控制权限 private default protect public 异常 ...

  9. struts2 笔记03 异常支持、防止页面刷新和后退、方法验证

    Struts2对异常支持(声明式异常.自动的异常处理), 异常处理(运行期异常事务自动回滚) 1. 自定义异常类,继承RuntimeException或Exception实现构造方法. 2. 配置异常 ...

  10. Java编程思想学习笔记_4(异常机制,容器)

    一.finally语句注意的细节: 当涉及到break和continue语句的时候,finally字句也会得到执行. public class Test7 { public static void m ...

随机推荐

  1. 每天一道LeetCode--409 .Longest Palindrome

    Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...

  2. Android使用JNI(从java调用本地函数)

    当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...

  3. apache windowns 下wamp配置多站点的问题

    1.多站点配置找到apache下面的 conf/httpd.conf # Virtual hostsInclude conf/extra/httpd-vhosts.conf  //将这句前面的#号注释 ...

  4. SERVER 2012 R2 core域环境下批量创建用户

      Write by xiaoyang 转载请注明出处 步骤一:创建域 基本配置 1.         输入命令进入配置 2.         输入8进入网络配置 3.         选择要配置的网 ...

  5. eclipse中tomcat配置(待完善)

    tomcat版本:apache-tomcat-6.0.29 项目结构:     一.新建server方式 二.eclipse tomcat plugin方式   tomcat plugin方式必须保证 ...

  6. MySQL高可用之MHA (转)

    MySQL高可用之MHA MHA简介 MHA是由日本人yoshinorim(原就职于DeNA现就职于FaceBook)开发的比较成熟的MySQL高可用方案.MHA能够在30秒内实现故障切换,并能在故障 ...

  7. PCB参数计算神器-Saturn PCB Design Toolkit下载及安装指南

    进行PCB设计,特别是高频高速设计时,难免会涉及到PCB相关参数的计算及设置,如:VIA的过流能力,VIA的寄生电容.阻抗等,导线的载流能力,两相互耦合信号线间的串扰,波长等参数. 这里向大家介绍一款 ...

  8. arm汇编指令总结(不断更新)

    /** ****************************************************************************** * @author    Maox ...

  9. Chipscope 仿真VmodCAM IIC程序

    Chipscope 仿真VmodCAM IIC程序: 目的:熟悉EDK中建立chipscope 注意:zedboard使用digilent USB下载时,chipscope不能和SDK同时使用,否则芯 ...

  10. logstash 统计告警

    在实际的项目中需要对线上日志做实时分析跟统计,这一套方案可以用现有的ELK(ElasticSearch, Logstash, Kibana)方案既可以满足,关于这个方案的具体的步骤可以参考网上的解决方 ...