抛出异常的区别 throw 和throw ex
在面试的过程中提到了异常捕获的的几种用法,之前一直使用但是没有仔细留意,调试程序的过程中发现还是有区别的,主要区别在堆栈信息的起始点不同,下边我们通过实例来看这集中不同的抛出异常的方法。
一般我们推荐throw来抛出异常,使用throw ex来抛出异常会清空存储的异常信息,认为已经处理过异常,只不过在抛出的过程中又产生的新的异常信息,从而找不到真正的错误源。
第一种 使用的人数最多,但是不推荐使用,这样处理异常程序会清空堆栈中的异常信息,在堆栈中重置异常点。
try
{
}
catch (Exception ex)
{
throw ex;
}
第二种 这种会追溯到异常的起源点,但是程序会报 定义的ex未被使用的警告
try
{
}
catch (Exception ex)
{
throw;
}
第三种 这中方式和第二种相同 可以捕获所有的异常,IDE也不会警告
try
{
}
catch
{
throw;
}
第四种 对异常重新包装,但同时保留了异常的起源点。
try
{
}
catch (Exception ex)
{
throw new Exception("经过进一步包装的异常", ex);
}
下边我们看具体使用过成中各种抛出异常的使用方法,对各种方法就会有了清晰的认识
using System; namespace Throw
{
class Program
{
static void Main(string[] args)
{
ExceptionClass ec = new ExceptionClass(); try
{
ec.ExceptionThrow1();
}
catch (Exception ex)
{ Console.WriteLine(ex.ToString());
}
Console.WriteLine("----------------------华丽的分割线---------------------------");
try
{
ec.ExceptionThrow2();
}
catch (Exception ex)
{ Console.WriteLine(ex.ToString());
}
Console.WriteLine("----------------------华丽的分割线---------------------------");
try
{
ec.ExceptionThrow3();
}
catch (Exception ex)
{ Console.WriteLine(ex.ToString());
}
Console.WriteLine("----------------------华丽的分割线---------------------------");
try
{
ec.ExceptionThrow4();
}
catch (Exception ex)
{ Console.WriteLine(ex.ToString());
}
Console.WriteLine("----------------------华丽的分割线---------------------------"); Console.ReadKey();
}
} /// <summary>
/// 测试上下文抛出异常 相关上下文 栈的调用情况
/// </summary>
public class ExceptionClass
{ private void ExceptionMethod()
{
throw new DivideByZeroException();
} /// <summary>
/// 抛出异常的方法
/// </summary>
public void ExceptionThrow1()
{
try
{
this.ExceptionMethod();
}
catch (Exception ex)
{
throw ex;
}
} public void ExceptionThrow2()
{
try
{
this.ExceptionMethod();
}
catch (Exception ex)
{ throw;
}
} public void ExceptionThrow3()
{
try
{
this.ExceptionMethod();
}
catch (Exception)
{ throw;
}
} public void ExceptionThrow4()
{
try
{
this.ExceptionMethod();
}
catch (Exception ex)
{ throw new Exception("经过进一步包装的异常",ex);
}
}
}
}
程序运行结果
`WX[0AUYM.png)
抛出异常的区别 throw 和throw ex的更多相关文章
- C#中使用throw和throw ex抛出异常的区别
通常,我们使用try/catch/finally语句块来捕获异常,就像在这里说的.在抛出异常的时候,使用throw和throw ex有什么区别呢? 假设,按如下的方式调用几个方法: →在Main方法中 ...
- (转) C#中使用throw和throw ex抛出异常的区别
通常,我们使用try/catch/finally语句块来捕获异常,就像在这里说的.在抛出异常的时候,使用throw和throw ex有什么区别呢? 假设,按如下的方式调用几个方法: →在Main方法中 ...
- throw和throw ex的区别
之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查,还真是,主要是区别在堆栈信息的起始点不同 ...
- 【转】C# 异常处理 throw和throw ex的区别 try catch finally的执行顺序(return)
[转]throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查 ...
- C#使用throw和throw ex的区别(转)
使用throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查, ...
- c# throw和throw ex
c# throw和throw ex 我们在日常开发当中,经常会用到exception异常,并且我们会在exception中的catch块中throw exception,例如: static void ...
- throw与throw的区别
Throwable 是所有 Java 程序中错误处理的父类 ,有两种资类: Error 和 Exception . Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的 ...
- throw与throws的区别
throws语句 throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常.对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的 ...
- try-catch和throw,throws的区别和联系
转载:http://blog.sina.com.cn/s/blog_62148d1e0100hkqc.html 区别一:throw 是语句抛出一个异常:throws 是方法抛出一个异常: throw语 ...
随机推荐
- [Redux] Store Methods: getState(), dispatch(), and subscribe()
console.clear(); const counter = (state = 0, action) => { switch (action.type) { case 'INCREMENT' ...
- Android开发系列之button事件的4种写法
经过前两篇blog的铺垫,我们今天热身一下,做个简单的样例. 文件夹结构还是引用上篇blog的截图. 详细实现代码: public class MainActivity extends Activit ...
- SlidingMenu导入编译用法--Eclipse和IDEA
非常多側滑的应用都用的是开源库SlidingMenu, 效果不错,下面是我用上的效果图,因为近期换成了IDEA(IntelliJ)编辑器,昨天上网找了全部的教程都是关于在Eclipse导入的方法,摸索 ...
- SWFObject文件上传使用记录
SWFObject文件上传使用方法记录,该插件使用起来相当强大也很灵活,与uploadify各有千秋. 值得一说的是,如果要设置button_image_url这个参数,该参数是按钮的背景图,但是一定 ...
- C#之Linq学习笔记【转】
写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...
- ASP.NET数据绑定控件简介
•数据绑定分为数据源和数据绑定控件两部分(①数据绑定控件通过数据源获取和修改数据②数据绑定控件通过数据源隔离数据提供者和数据使用者)数据绑定控件→数据源→数据库•数据源:SqlDataSource(连 ...
- WinAPI——模拟正弦波
/*************************** * * 程序名称 : 模拟正弦波 * 作 者 : doodle777 * 版 本 : 1.1 * 日 期 : 2012-10-19 * 说 明 ...
- mysql查询计划
mysql查询计划 1:客户端发起查询请求 2:服务器接收到请求后,先查询缓存 如果缓存命中,直接返回数据给客户端 否则,解析sql 3:sql解析完成后,进行预处理 4:有查询优化器生存查询计划 5 ...
- Undefined symbols for architecture x86_64:
真机运行正常, 但要在模拟器运行的时候, 编译就报错了: 解决方法: 1.将Build Settings的Architectures修改为arm7 armv7s.Xcode7默认是加上arm64的,但 ...
- jQuery旋转插件
jQuery旋转插件,支持Internet Explorer 6.0 + .Firefox 2.0.Safari 3.Opera 9.Google Chrome,高级浏览器下使用Transform,低 ...