之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时发展找不到异常根源,无意中了解到几种使用方法是有区别的。总结如下:

我们都知道,C#中使用throw和throw ex抛出异常,但二者是有区别的。

在C#中推荐使用throw;来抛出异常;throw ex;会将到现在为止的所有信息清空,认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,从而找不到真正的错误源。

throw new Exception()包装一个异常,把内部异常Exception也抛出,这样抛出的异常是最全面详细的异常。

throw的用法主要有以下几种:

1、第一种

(不推荐使用,可惜很多人都一直这么用的),这样适用会吃掉原始异常点,重置堆栈中的异常起始点:

try
{
}
catch (Exception ex)
{throw ex;
}

2、第二种

可追溯到原始异常点,不过编译器会警告,定义的ex未有使用:

try
{
}
catch (Exception ex)
{throw;
}

3、第三种

不带异常参数的,这个同第二种其实一样,可捕获所有类型的异常,IDE不会告警:

try
{
}
catch
{throw;
}

4、第四种

经过对异常重新包装,但是会保留原始异常点信息。推荐使用。

try
{
}
catch (Exception ex)
{throw new Exception("经过进一步包装的异常", ex);
}

5、举例

using System;
using System.Collections.Generic;
using System.Text;namespace Api.Service.Common
{public class ExceptionClass{/// <summary>/// 抛出异常方法/// </summary>public void ExceptionThrow1(){try{// 调用原始异常抛出方法来抛出异常this.ExceptionMethod();}catch (Exception ex){throw ex;}}/// <summary>/// 抛出异常方法1/// </summary>public void ExceptionThrow2(){try{this.ExceptionMethod();}catch (Exception ex){throw;}}/// <summary>/// 抛出异常方法2/// </summary>public void ExceptionThrow3(){try{this.ExceptionMethod();}catch{throw;}}/// <summary>/// 抛出异常方法3/// </summary>public void ExceptionThrow4(){try{this.ExceptionMethod();}catch (Exception ex){throw new Exception("经过进一步包装的异常", ex);}}/// <summary>/// 原始异常抛出方法/// </summary>private void ExceptionMethod(){throw new DivideByZeroException();}}
}
ExceptionClass exceptionClass = new ExceptionClass();try{exceptionClass.ExceptionThrow1();}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.WriteLine("分割线--------------------------------------");try{exceptionClass.ExceptionThrow2();}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.WriteLine("分割线--------------------------------------");try{exceptionClass.ExceptionThrow3();}catch (Exception ex){Console.WriteLine(ex.ToString());}Console.WriteLine("分割线--------------------------------------");try{exceptionClass.ExceptionThrow4();}catch (Exception ex){Console.WriteLine(ex.ToString());}

举例结果:

6、总结

我们可以明显看出new Exception()自己包装的异常比较详细,能找到异常的跟踪,其次是throw  都可以找到异常源。

throw ex;会把异常吞掉,抛出新的异常,这样会让开发人员找不到异常源。

推荐使用new Excetion()也就是第四种方式。

C#--throw的几种抛异常方式及区别相关推荐

  1. 了解mysql的三种不同安装方式的区别

    学习目的:了解mysql的三种不同安装方式的区别 学习内容: mysql 的安装有三种:分别是源码安装.二进制安装.rpm安装. 源码安装的优势:linux操作系统开放源代码,因此在其上面安装的软件大 ...

  2. 虚拟机linux和主机网络连接,linux虚拟机中和主机三种网络连接方式的区别

    linux虚拟机中和主机三种网络连接方式的区别 在介绍网络模式之前,关于网络的几个简单命令的使用 ifup eth0 //启动网卡eth0 ifdown eth0 //关闭网卡eth0 /etc/ne ...

  3. 海康大华网络摄像头高起播低延时RTSP网页无插件流媒体专用播放器EasyPlayer-RTSP之GDI和D3D两种视频渲染方式的区别介绍

    GDI和D3D两种视频渲染方式的区别 EasyPlayer-RTSP windows播放器支持D3D和GDI两种渲染方式. D3D支持格式如下: DISPLAY_FORMAT_YV12 DISPLAY ...

  4. 虚拟机几种网络连接方式的区别

    虚拟机,不论是VirtualBox还是VMWare,都提供了几种网络连接方式,其中包括了桥接(Bridged).网络地址翻译(NAT)和主机模式(Host-only). 桥接(Bridged)相当于在 ...

  5. 函数传参string_C/C++的三种函数传值方式及其区别

    C/C++函数传参方式我想很多朋友应该都知道,但是不同传参方式的背后他们的区别是什么我想很多人并不那么清楚.本文就给大家揭露一下各传参方式的区别. 传参方式有这三种:值传递.引用传递.指针传递 大家可 ...

  6. Stateflow中三种状态转移方式的区别(默认转移、外部转移、内部转移)

    文章目录 前言 一.让人头秃的自增循环 二.默认转移和内部转移的区别 三.抛弃during追求entry 总结 前言 Stateflow中有三种典型的状态转移方式:默认转移.外部转移.内部转移. 其中 ...

  7. golang 切片的三种简单使用方式及区别

    概念 切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构.切片并不存储任何元素而只是对现有数组的引用. 三种方式及细节案例 ①定义一个切片,然后让切片去引用一个已经创建好的数组 pa ...

  8. get和post 两种基本请求方式的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  9. Golang切片的三种简单使用方式及区别

    概念 切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构.切片并不存储任何元素而只是对现有数组的引用. 三种方式及细节案例 ①定义一个切片,然后让切片去引用一个已经创建好的数组 pa ...

最新文章

  1. .NET设计模式(4):建造者模式(Builder Pattern)(转)
  2. spark submit 入门
  3. camtasia studio 8.2使用技巧集锦
  4. isql 测试mysql连接_[libco] 协程库学习,测试连接 mysql
  5. java对象模型 指令_深入理解多线程(二)—— Java的对象模型
  6. js中div显示和隐藏钮为什么页面总是跳一下到最上面
  7. flash一个按钮控制动画_flutter闪屏过渡动画,闪光占位动画
  8. InfluxDB源码阅读之httpd服务
  9. 《Effective Java读书笔记》--通用程序设计
  10. Git 基础(八)—— Github 的使用(账号管理)
  11. win7和xp无线共享网络问题
  12. python第二十二天,configparser模块 subprocess 模块,xlrd 模块(表格处理)
  13. 计算机的屏幕录像,如何进行电脑屏幕录像?电脑录制屏幕视频的方法|电脑屏幕录像的图文步骤...
  14. vmware fusion 7 序列号
  15. 教程 | 10分钟入门数位板绘图,一张图足以说明方法!
  16. 三星S5660刷机及Root
  17. AutoIT测试实例
  18. 【食品加工技术】第四章 饮料生产技术 笔记
  19. 昊鼎王五:网站(前端)如何调用美图秀秀?
  20. 在线网络打字系统_打字比赛系统软件

热门文章

  1. 联想YOGA 3笔记本如何U盘启动
  2. 面试磕磕碰碰,辛得蚂蚁高级工程师的技术笔记指导,终获P7岗offer
  3. dnf剑魂buff等级上限_DNF:剑魂职业改版加强,超一线剑魂职业如何技能加点?...
  4. 微信分享到朋友圈的链接没有图片。开发工具中正常没有报错-解决方案
  5. 入网许可证_入网许可证真伪鉴别
  6. Material Design 之Style(三)
  7. 《C程序设计语言》笔记 第6章 结构
  8. 基于tkinter界面requests爬虫实现的学生事务管理平台自动填写系统
  9. 【个人向】《春物》 小说原文关键段落摘录
  10. Python爬虫51job职位