异常处理 Exception
一、异常类
1、在C#中所有的异常都是使用一个异常类型的示例对象表示的,这些异常类型都是继承自System.Exception类型,或者直接使用System.Exception类型的实例对象;
2、在C#中,位于finally块中的代码可以保证不管代码是正常结束,还是进入异常处理代码块,其中的语句均会被执行。
System.Exception类有一些属性值得注意,这些属性被所有从此类派生的异常类共享,这些属性是:
Message:一个只读字符串,此属性为当前的异常提供了描述性信息;
InnerException:一个Exception类型的只读属性,如果它的值不为null,则可以通过它的值获取导致当前异常的异常实例;反之,如果其值为null,则表示当前异常不是由其他异常引发的。
StackTrace:一个只读字符串,此属性描述了异常发生时调用堆栈的内容,其中首先显示最近的方法调用。
二、抛出异常
当程序有错误的时候可以创建一个描述该错误的异常对象,然后用throw关键字抛出异常对象,抛出的异常对象将被当前代码的更上层代码所捕获,或者不处理直接抛出,或者干脆不予捕获。那么该异常将一直向上传递,直到有人捕获并处理它。

class Program
{
static void Main(string[] args)
{
DoSomething(null); Console.ReadKey();
} public static void DoSomething(string name)
{
if (name == null)
{
throw new ArgumentException("参数不能为空!");
}
}
}

三、捕获异常
可以使用try/catch来捕获并选择是否处理异常,捕获了异常并非一定要处理异常,还可以将异常转换为另一个异常后再抛出,或者仅仅是记录异常的信息。
要记住,始终必须按照从最特定到最不特定(从具体到一般)的顺序对catch块中处理的异常进行排序,这个原则可以保证在将某个特定异常传递给更一般的异常的catch块之前处理该异常。
try/catch块有三种形式:try-catch、try-finally、try-catch-finally,不带有catch或finally块的try语句将导致编译器错误。
try语句中的代码是可能抛出异常的代码,catch块捕捉某种特定的异常并加以处理。这些catch块可以有多个,并且catch块可以串联在一起,如果存在多个catch块,那么计算顺序是从顶部到底部。但是对于所引发的每个异常,都只执行一个catch块。
1、好的编程的做法是捕获特定类型的异常,而不是捕获更常规的异常。
2、如果捕获特定类型的catch块捕获异常的基类型catch块同时存在,则前者要位于后者之前,否则将无法通过编译。

class Program
{
static void Main(string[] args)
{
DoSomething(null); Console.ReadKey();
} public static void DoSomething(string name)
{ try
{
Console.WriteLine(name);
if (name == null)
{
throw new ArgumentException("参数不能为空!");
}
}
catch (ArgumentException ex)
{
name = "你好";
DoSomething(name);
Console.WriteLine(ex.Message); }
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{ }
}
}

四、自定义的异常类
要创建用户自定义异常类,需要遵循以下几点
1、从System.ApplicationException或者System.Exception类派生。
2、使用"Exception"这个词作为自定义的异常名称的后缀。
3、至少提供三个公共函数。
4、一个不包含参数的默认构造函数。
5、一个可以包含异常消息的构造函数,只有一个参数:message。
6、一个可以包含异常消息,以及引发该异常的异常引用的构造函数,这两个参数分别是message和innerException。
public class OneException : System.ApplicationException
{
public OneException() { }
public OneException(string message) : base(message){}
public OneException(string message,System.Exception innerException) : base(message,innerException){}
}
五、异常处理原则
1、尽量由程序自动处理异常。当异常发生时,程序在捕获后应该先尝试处理异常,如果错误得以排序,那么程序可以恢复正常,而不是每次捕获异常就立刻通知用户来处理,或者仅仅把异常信息记录下来。例如网络传送发生连接错误,应该先重连几次,然后再通知用户处理。
2、限制异常范围,应该尽量地减少缩小异常处理的范围,如果只需要检测某一行代码可能发生异常,就不要把整段的代码都放进try语句块中。
3、应该捕获更具体的异常。尽量避免直接捕获Exception异常。
4、尽可能在上层捕获并处理异常。
5、应该将异常信息保存在日志中。
突然回忆起上次面试的一段代码:

class Program
{
static void Main(string[] args)
{
string name = GetName();
Console.WriteLine(name); //输出 就算return了这行也会执行哦!
//输出 你好
Console.ReadKey();
} public static string GetName()
{
try
{
return "你好";
}
catch (Exception ex)
{
return "捕捉到异常!";
}
finally
{
Console.WriteLine("就算return了这行也会执行哦!");
}
}
}

留意到,几时是没抛出异常同时return了也执行了finally里面的代码。
异常处理 Exception的更多相关文章
- 异常处理—Exception(三)
最近有点事,把这个系列给落下了,给大家道个歉,这里还要感谢我的老婆,谢谢她一直对我的支持:) 系列回顾: 1.异常处理--Exception(一) 2.异常处理—Exception(二) 上一篇中主要 ...
- 异常处理—Exception(二)
在上一篇中"异常处理--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处 ...
- ORACLE PL/SQL异常处理(Exception)学习笔记
1.PL/SQL错误类型 错误类型 报告者 处理方法 编译时错误 PL/SQL编译器 交互式地处理:编译器报告错误,你必须更正这些错误 运行时错误 PL/SQL运行时引擎 程序化地处理:异常由异常处理 ...
- Akka(26): Stream:异常处理-Exception handling
akka-stream是基于Actor模式的,所以也继承了Actor模式的“坚韧性(resilient)”特点,在任何异常情况下都有某种整体统一的异常处理策略和具体实施方式.在akka-stream的 ...
- java异常处理Exception
我看别人的面经中有一道题目就问到了Exception,即java的异常处理的,我曾经也学了java的异常处理,可是我查了下,看了别人的博客关于写的exception异常处理.我发现,自己学的不坚固,仅 ...
- Java自学-异常处理 Exception
Java 异常 Exception 异常定义: 导致程序的正常流程被中断的事件,叫做异常 步骤 1 : 文件不存在异常 比如要打开d盘的LOL.exe文件,这个文件是有可能不存在的 Java中通过 n ...
- java 异常和异常处理Exception
Java Exception: 1.Error 2.Runtime Exception 运行时异常3.Exception 4.throw 用户自定义异常 异常类分两大类型:Error类代表了编译和系统 ...
- 异常处理--Exception(一)
很诱人的标题,今天不是给大家介绍,而是跟大家讨论些问题. 在做开发的这几年中,大大小小的项目也经历了很多,但无论那个项目中,都没有真正的对Exception进行完整的处理.虽然我们在学C#的时候,经常 ...
- Python之异常处理-Exception
在写python程序时, 不要害怕报错, 也不要怕自己的英语不够好, 不要看到一有红色的字就心里发怂. 其实报的错也是有套路可寻滴~识别了异常的种类, 才能对症下药. 常见异常: Exception ...
随机推荐
- win 7 64位如何安装erdas 9.2
最主要的就是crack包必须包含这三个文件:erdas.exe、license.dat和lmgrd.exe 将这三个文件都复制到C盘安装目录下bin中,其余安装同win 7 32位系统
- OO之观察者模式
以下为观察者模式详解: 引子: 假设有这样一个问题,有一条河经过一个山谷,山谷下有一个村庄,人们在山谷处修建了一个水库,并安排专人管理,当水库的水位过高时要通知下游居民注意水库的开闸放水,当水库的水温 ...
- css3 简单界面动画
asdasdasdasda asdasdasdasda
- IOS项目集成ShareSDK实现第三方登录、分享、关注等功能(备用)
(1)官方下载ShareSDK iOS 2.8.8,地址:http://sharesdk.cn/ (2)根据实际情况,引入相关的库,参考官方文档. (3)在项目的AppDelegate中一般情况下有三 ...
- iOS基本网络请求
常见的网络请求有同步GET, 同步POST, 异步GET, 异步POST. GET请求和POST请求的区别: 1. GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过 ? ...
- 使用Compass制作雪碧图
遇见好的文章,笔者也会转载.但是正所谓好记性不如烂笔头,单纯的拿来主义也不如自己的亲自实践.所以每次需要转载的文章,我都会自己敲一遍,中间加入一些自己的思考. 这篇文章转载自:http://www.h ...
- C# SqlConnection
public static ArrayList Connect(string connectionString, string commandText) { ArrayList retValList ...
- C#中字符串驻留技术
转自:http://www.cnblogs.com/Charles2008/archive/2009/04/12/1434115.html MSDN概念:公共语言运行库通过维护一个表来存放字符串,该表 ...
- 【斜率DP】bzoj1597: [Usaco2008 Mar]土地购买
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2474 Solved: 900[Submit][ ...
- Detect loop in a singly linked list
去Twitter面试的被问到这个问题,当时只想到了用HashMap的办法,这种办法时间复杂度O(n),空间复杂度是O(n), 更好的办法是用 FastRunner / SlowRunner appro ...