C#中异常捕获相信大家都很熟悉,经常使用的异常捕获有:
1. try{.....} catch (Exception ex) {throw ex;}
2. try{.....} catch (Exception) {throw;}
3. try{.....} catch (Exception ex) {throw new Exception("异常描述",ex);}
 
相信对于这3种写法大家都很熟悉,但对于这3种之间的细微区别不知大家是否清楚。今天我就给大家分享一下他们之间的区别以及哪种情况下使用哪种捕获方式比较好。
 
首先请大家看看下面这段代码:
     static void Main(string[] args)
        {
            try
            {
                Test1();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
            }
 
            Console.ReadKey();
        }
 
        static void Test1()
        {
            try
            {
                Test2();
            }
            catch (Exception ex)
            {
                //throw ex;
                //throw;
                //throw new Exception(ex.Message, ex);
            }
        }
 
        static void Test2()
        {
            throw new Exception("这儿抛出的异常");
        }
 
我们的Test2方法抛出异常,在Test1中调用,并且捕获这个异常。然后在上层main方法中调用Test1方法,捕获里面抛出来的异常。在Test1中我们分别使用3种捕获异常的方式,看看有什么不同的地方。
 
首先 try{ .....}catch (Exception ex){throw ex;}方式捕获异常:
可以看到,在上层方法main方法中捕获的异常堆栈信息只能捕获到33行,而我们真实的异常是出现在39行的。
 
在看看try{.....} catch(Exception){throw;}方式捕获异常:
可以看到,使用这种方法,异常堆栈信息精确的定位到了异常的产生位置39行。
 
最后在看看使用try{.....} catch(Exception ex){throw new Exception("异常描述",ex);}方式捕获异常的区别:
可以看到,在使用这种方式捕获异常的话,上层方法main捕获的异常堆栈信息是从Test1方法开始的,也就是35行;而异常精确产生的堆栈信息是包含在InnerException 属性的对象里面的。
 
   从上面的实验可以看出:
第一种捕获异常的方法会丢失真实的异常堆栈信息。
第二种可以完整的捕获异常堆栈信息。
第三种也可以完整的捕获异常堆栈信息,还可以自定义异常描述信息。
 
综上,3种捕获方式更适合在哪种情况下使用,就明了了:
1. try{.....} catch (Exception ex) {throw ex;}  不推荐使用
2. try{.....} catch (Exception) {throw;}   在不对异常信息进行修饰或改变的时候推荐使用,也是代码段自动生成的默认方式
3. try{.....} catch (Exception ex) {throw new Exception("异常描述",ex);}   在需要对异常信息进行自定义描述的时候使用

C#异常小知识的更多相关文章

  1. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

  2. salesforce 零基础开发入门学习(十)IDE便捷小知识

    在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...

  3. JS框架设计读书笔记之-小知识

    这一篇写一点小知识 JS中0.1+0.2为什么不等于0.3? 关于这个问题之前也很疑虑,老师也只是笼统的讲这是JS的语言问题,但是内部具体的情况却没有讲,看了书才发现原理如此简单. 简单来讲,计算机识 ...

  4. 【C#小知识】C#中一些易混淆概念总结(六)---------解析里氏替换原则,虚方法 分类: C# 2014-02-08 01:53 1826人阅读 评论(0) 收藏

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  5. 蓝牙Bluetooth技术小知识

    蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...

  6. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  7. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

  8. Unix系统小知识(转)

    Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...

  9. Jquery:小知识;

    Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器   上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理 ...

随机推荐

  1. SQL Server中的database checkpoint

    基于性能方面的考虑, 数据库引擎会在内存(buffer cache)中执行数据库数据页(pages)的修改, 不会再每次做完修改之后都把修改了的page写回到磁盘上. 更准确的说, 数据库引擎定期在每 ...

  2. Iterator 迭代器模式 MD

    迭代器模式 简介 Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问[委让]给外部类,使用Iterator按顺序进行遍历访问. 在程序设计中,经常有这种情况:需要从大量的数据集合中一 ...

  3. 几行JavaScript代码搞定Iframe 自动适应

    场景:Iframe嵌入flash,希望flash能随着页面的resize而resize. 主要代码: 代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM ...

  4. 【Hadoop】Combiner的本质是迷你的reducer,不能随意使用

    问题提出: 众所周知,Hadoop框架使用Mapper将数据处理成一个<key,value>键值对,再网络节点间对其进行整理(shuffle),然后使用Reducer处理数据并进行最终输出 ...

  5. linux主机名的修改

    导读 在一个局域网中,每台机器都有一个主机名,便于主机与主机之间的区分,因此为每台机器设置主机名,以容易记忆的方法来相互访问.比如我们在局域网中可以为根据每台机器的功用来为其命名. 查看主机名命令 [ ...

  6. SIT/UAT测试

    SIT/UAT测试 学习了:https://blog.csdn.net/just_tigris/article/details/52441823 https://baike.baidu.com/ite ...

  7. 2015年末分享:利用RS修改用户密码

    马上就要2016农历新年了,送点什么给大家呢?我觉得还是分享点技术吧.前不久用户在抱怨为什么登录Cognos Connection的密码不能让我们自己改?相信Cognos开发的很多人知道,Cognos ...

  8. easyui加入自己定义图标

    近期用easyui发现图标挺少的,事实上能够另外加入一个css样式,只是我偷懒,直接在easyui的css里面加入了. 以下是文件夹: icon.css是easyui的默认样式文件.ext_icons ...

  9. 把mysql数据库生成数据字典,直接可用

    便于查看数据库表.字段,做一个数据字典是很有必要的,下面只需要简单更改下配置就可以用了,样式也是挺好的. <?php header('content-type:text/html;charset ...

  10. Oracle多行记录合并自定义函数

    在oracle数据库中,进行字段合并,可以使用wm_concat(column)函数,但是在这种方法不被Oracle所推荐,因为WMSYS用户用于Workspace Manager,其函数对象可能因版 ...