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. C# 开发者代码审查清单

    这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...

  2. Geolocation地理定位

    地理位置(Geolocation)是 HTML5 的重要特性之一,提供了确定用户位置的功能,借助这个特性能够开发基于位置信息的应用.今天这篇文章向大家介绍一下 HTML5 地理位置定位的基本原理及各个 ...

  3. 以AVL树为例理解二叉树的旋转(Rotate)操作

    树旋转是在二叉树中的一种子树调整操作, 每一次旋转并不影响对该二叉树进行中序遍历的结果. 树旋转通常应用于需要调整树的局部平衡性的场合. 树旋转包括两个不同的方式, 分别是左旋转和右旋转. 两种旋转呈 ...

  4. SQL-查询排名

    select row_number() over(order by amount) as rank,* from dbo.t_group

  5. VS2008+Windows DDK 7的环境配置

    Mark offers some third party utilities. That's good, but I will show a more handy way (IMHO): how to ...

  6. BZOJ 1264 AHOI2006 基因匹配Match 动态规划+树状数组

    题目大意:给定n个数和两个长度为n*5的序列,每一个数恰好出现5次,求两个序列的LCS n<=20000.序列长度就是10W.朴素的O(n^2)一定会超时 所以我们考虑LCS的一些性质 LCS的 ...

  7. 基于XMPP 协议的开发 android

    设计过一款基于开源的XMPP即时通信协议的软件.採用C/S协议,通过GPRS无线网络用TCP协议到server.以架设开源的Openfire server作为即时通讯平台 系统主要由下面部分组成:一是 ...

  8. window下redis nosql初试

    1:redis官方下载地址http://redis.io/download   下载下来,有32位的,有64位的,自己选择. 2:将redis文件夹放到D盘:D:\redis watermark/2/ ...

  9. 转:C#委托与事件

    委托与事件    Ganesh Nataraj最近写了一篇解释委托与事件的文章,在坊间流传较广,今天翻译成中文与大家共享,如有不妥之处,欢迎留言讨论.    C#中的委托类似于C或C++中的函数指针. ...

  10. vue 通信方式汇总

    1.10种通信方式 10种:https://juejin.im/post/5bd18c72e51d455e3f6e4334 2.除此之外,还有children和ref. 需要注意 $children  ...