C#笔记1:异常
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:异常的更多相关文章
- python学习笔记5_异常
python学习笔记5_异常 1.什么事异常 Python使用异常对象(exception object) 来表示异常情况.遇到错误会发生异常. 如果异常对象未被处理或被捕捉,程序就会用所谓的回溯(t ...
- 笔记-python异常信息输出
笔记-python异常信息输出 1. 异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...
- Windows内核读书笔记——Windows异常分发处理机制
本篇读书笔记主要参考自<深入解析Windows操作系统>和<软件调试>这两本书. IDT是处理异常,实现操作系统与CPU的交互的关口. 系统在初始化阶段会去填写这个结构. ID ...
- 斯坦福机器学习视频笔记 Week9 异常检测和高斯混合模型 Anomaly Detection
异常检测,广泛用于欺诈检测(例如“此信用卡被盗?”). 给定大量的数据点,我们有时可能想要找出哪些与平均值有显着差异. 例如,在制造中,我们可能想要检测缺陷或异常. 我们展示了如何使用高斯分布来建模数 ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- Java笔记:异常
Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类. Exception 类是 Throwable 类的子类.除了Exception类外,Throwa ...
- Effective Java 读书笔记之八 异常
一.只针对异常的情况才使用异常 1.类具有状态相关的方法时,可采用状态测试方法和可识别的返回值两个策略. 二.对可恢复的情况使用受检异常,对编程错误使用运行时异常 1.期望调用者能够适当恢复的情况,应 ...
- javase基础笔记4——异常/单例和类集框架
继承 extends final关键 多态 是在继承的基础上 接口 interface 异常 exception 包的访问可控制权限 private default protect public 异常 ...
- struts2 笔记03 异常支持、防止页面刷新和后退、方法验证
Struts2对异常支持(声明式异常.自动的异常处理), 异常处理(运行期异常事务自动回滚) 1. 自定义异常类,继承RuntimeException或Exception实现构造方法. 2. 配置异常 ...
- Java编程思想学习笔记_4(异常机制,容器)
一.finally语句注意的细节: 当涉及到break和continue语句的时候,finally字句也会得到执行. public class Test7 { public static void m ...
随机推荐
- JS验证框架(exValidation)
exValidation是一个前台校验框架 能够校验前台的常用的输入错误. 例如,必须输入,用户输入长度...... ----------------------------------------- ...
- Js判断CSS文件加载完毕的实例教程
要判断这个 CSS 文件是否加载完毕,各个浏览器的做法差异比较大,这次要说IE浏览器做的不错,我们可以直接通过onload方法来处理CSS加载完成以后的处理: 代码如下 复制代码 // 代码节选至se ...
- C#中如何查找Dictionary中的重复值
简介 在这篇帮助文档中,我将向你展示如何实现c#里字典中重复值的查找.你知道的对于一个老鸟来说,这是非常简单的代码.但是尽管如此,这也是一篇对c#初学者非常有用的帮助文档. 背景 多数程序员对小型数据 ...
- Java实现邮箱找回密码 --转载
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- Objective-C排序算法实现
算法作为程序猿的一种基本技能,对我来说却一直是一个硬伤.毕竟平时的工作接触算法的地方很少,大部分时间都是在搭建UI,写业务逻辑,写网络请求.然而在面试当中,算法往往又是考察的重点. 也许你会说这些平时 ...
- php连接到数据库
html代码: <form action="php_mysql_add.php" method="post"> 用户名: <input typ ...
- 求单链表倒数第m个结点
问题:求单链表倒数第m个结点,要求不准求链表的长度,也不许对链表进行逆转 解:设置两个指针p和q,p.q指向第一个结点.让p先移动到链表的第m个结点,然后p和q同时向后移动,直到p首先到达尾结点.此时 ...
- 1 . Robberies (hdu 2955)
The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually g ...
- Spring Security (Acegi)的登陆配置
简短记录一下: 在authenticationProcessingFilter这个bean中,如果没有配置<property name="alwaysUseDefaultTargetU ...
- 【风马一族_xml】xml编程
xml编程:利用java程序支增删改查(CRUD)XML中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了很多的解析api sun jaxp (比较弱)既有dom方式也有sa ...