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. iOS:步进UIStepper、滑动块UISlider、开关UISwitch的基本使用

    步进UIStepper.滑动块UISlider:当它们作为事件,被触发时,它们的值会发生改变.正因为如此,触发该事件时,可以一张一张翻阅浏览图片,,,, 步进UIStepper: @property( ...

  2. Composite 组合模式 树 递归 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. 巧妙使用div+css模拟表格对角线

    首先声明: 这只是探讨一种CSS模拟表格对角线的用法,实际在工作中可能觉得这样做有点小题大作,这不是本主题讨论的重点.如果对此深以为然的朋友,请一笑过之... 有时在插入文档时,要用到表格对角线,常见 ...

  4. Android NFC近场通信03----读写MifareClassic卡

                                           Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来 ...

  5. file not found app文件

    昨天svn迁移.然后又一次check out之后编译遇到这个错误. Ld Build/Products/Debug-iphonesimulator/wiseCloudCrmTests.xctest/w ...

  6. angular6 NgModule中定义模块module

    用这个@NgModule()这个decorator ,放在一个class的上面,这个class一个一个module了 @NgModule() 里面的参数是一个对象,用来配置的,声明这个module里面 ...

  7. 转: telnet命令学习

    1.每天一个linux命令(58):telnet命令 转自: http://www.cnblogs.com/peida/archive/2013/03/13/2956992.html telnet命令 ...

  8. Python标准库:内置函数abs(x)

    返回数字的绝对值. 參数能够是整数或浮点数.假设參数是复数,则返回复数的模. 因此abs()函数的注意点就是复数的不一样计算方式. 样例: #正整数 print('abs(1):', abs(1)) ...

  9. C#.NET常见问题(FAQ)-SplitPanel如何设置上下和左右

    定位到Orientation属性即可     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的在线论坛: http: ...

  10. openfire 用户名+密码 配置

    安装了openfire后要求配置,通常用户名都是admin,密码是安装时用户所设定的密码.由于种种原因会出现无法登陆的现象.现有两种方法可以解决. 1. 进入openfire的安装目录下---> ...