C#中throw的用法_异常路径
2016-06-06 10:37
274 查看
在C#的异常处理中,有一个关键字是throw,大家一定在catch块中或多或少的使用过,那么是否注意过不同的throw语句抛出的异常有何区别,请看下面的例子。
例1
使用log4net输出的日志如下:
例2
下一步,我们将Class2稍作修改
输出日志如下:
例3
我们再来修改下class2,这一次的改动稍微增大
仔细观察三次的异常日志一定会有所发现,。在例1中,虽然异常的描述信息是class1,但是log4net记录的异常堆栈信息缺没有class1的踪影,只记录下了class2.Test()。而例2中的日志不只记录下了异常的描述信息,而且完整的记录下了引发异常方法的调用信息。
不同点在哪里,请注意例1中在throw的时候使用了参数ex,而例2没有参数,这个无参的throw可以看做为rethrow(即继续抛出),他会抛出之前捕获到的所有异常。而2中带参数的则不同,他虽然会抛出同样的异常,但是异常的堆栈信息缺在throw的时候被改变了,我们在接下来的try块中无法获取异常的原始信息。例3则完全是一个新的异常,class1中抛出的异常被当做内部异常,存放在innerexception中。
C#为我们提供了相当完备的异常路径,我们可以通过不同的throw方式使异常的路径可选。在实际的使用中需要根据不同的使用场景,选择不同的throw方式。比如需要查看完整的异常路径时,我们应该使用2中的方式,即不带参数的throw。
例1
class Program { static void Main(string[] args) { LoggerFileFactory.ConfigurationFilePath =Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"Config\log4net.config"); try { Class2.Test(); } catch (Exception ex) { AppLogger.ApplicationLogger.Error("err", ex); } } } class Class1 { public static void Test() { throw new Exception("class1"); } } class Class2 { public static void Test() { try { Class1.Test(); } catch (Exception ex) { //do something throw ex; } } }
使用log4net输出的日志如下:
例2
下一步,我们将Class2稍作修改
class Class2 { public static void Test() { try { Class1.Test(); } catch (Exception ex) { //do something throw; } } }
输出日志如下:
例3
我们再来修改下class2,这一次的改动稍微增大
class Class2 { public static void Test() { try { Class1.Test(); } catch (Exception ex) { //do something throw newException("class2", ex); } } }
仔细观察三次的异常日志一定会有所发现,。在例1中,虽然异常的描述信息是class1,但是log4net记录的异常堆栈信息缺没有class1的踪影,只记录下了class2.Test()。而例2中的日志不只记录下了异常的描述信息,而且完整的记录下了引发异常方法的调用信息。
不同点在哪里,请注意例1中在throw的时候使用了参数ex,而例2没有参数,这个无参的throw可以看做为rethrow(即继续抛出),他会抛出之前捕获到的所有异常。而2中带参数的则不同,他虽然会抛出同样的异常,但是异常的堆栈信息缺在throw的时候被改变了,我们在接下来的try块中无法获取异常的原始信息。例3则完全是一个新的异常,class1中抛出的异常被当做内部异常,存放在innerexception中。
C#为我们提供了相当完备的异常路径,我们可以通过不同的throw方式使异常的路径可选。在实际的使用中需要根据不同的使用场景,选择不同的throw方式。比如需要查看完整的异常路径时,我们应该使用2中的方式,即不带参数的throw。
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#比较二个数组并找出相同或不同元素的方法