在面试的过程中提到了异常捕获的的几种用法,之前一直使用但是没有仔细留意,调试程序的过程中发现还是有区别的,主要区别在堆栈信息的起始点不同,下边我们通过实例来看这集中不同的抛出异常的方法。

  一般我们推荐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);
}
}
}
}

程序运行结果

抛出异常的区别 throw 和throw ex的更多相关文章

  1. C#中使用throw和throw ex抛出异常的区别

    通常,我们使用try/catch/finally语句块来捕获异常,就像在这里说的.在抛出异常的时候,使用throw和throw ex有什么区别呢? 假设,按如下的方式调用几个方法: →在Main方法中 ...

  2. (转) C#中使用throw和throw ex抛出异常的区别

    通常,我们使用try/catch/finally语句块来捕获异常,就像在这里说的.在抛出异常的时候,使用throw和throw ex有什么区别呢? 假设,按如下的方式调用几个方法: →在Main方法中 ...

  3. throw和throw ex的区别

    之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查,还真是,主要是区别在堆栈信息的起始点不同 ...

  4. 【转】C# 异常处理 throw和throw ex的区别 try catch finally的执行顺序(return)

    [转]throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查 ...

  5. C#使用throw和throw ex的区别(转)

    使用throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查, ...

  6. c# throw和throw ex

    c# throw和throw ex 我们在日常开发当中,经常会用到exception异常,并且我们会在exception中的catch块中throw exception,例如: static void ...

  7. throw与throw的区别

    Throwable 是所有 Java 程序中错误处理的父类 ,有两种资类: Error 和 Exception . Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的 ...

  8. throw与throws的区别

    throws语句       throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常.对大多数Exception子类来说,Java   编译器会强迫你声明在一个成员函数中抛出的异常的 ...

  9. try-catch和throw,throws的区别和联系

    转载:http://blog.sina.com.cn/s/blog_62148d1e0100hkqc.html 区别一:throw 是语句抛出一个异常:throws 是方法抛出一个异常: throw语 ...

随机推荐

  1. 苹果iOS操作系统整体架构层次讲解

     iOS的系统架构分为四个层次:核心操作系统层(Core OS layer).核心服务层(Core Services layer).媒体层(Media layer)和可触摸层(Cocoa Touch ...

  2. poj 2749 Building roads (二分+拆点+2-sat)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6229   Accepted: 2093 De ...

  3. DataTable操作工具类DataTableHelper

    DataTable操作工具类DataTableHelper. 功能介绍: 将泛型集合填充为数据表 将泛型填充为数据表 将对象集合填充为数据表 将对象填充为数据表 将定IDictionary数据转换为D ...

  4. 打勾显示输入的密码 --EditText与setTransformationMethod

    实现目标: 实现原理: 为CheckBox添加一个监听器事件; 实现的源码: package edu.cquptzx.showPassword; import android.app.Activity ...

  5. (转)java 23种设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. nyoj 214

    //nyoj 214 这个题目和字符串的问题类似,都是给出一组数据,寻找最长的单调递增字符 这一题一开始我用dp做,发现超时,看了下时间,n*n的复杂度,换过一种思路 用类似于栈的方式,来存储每次更新 ...

  7. nyoj 17

    // nyoj 17        代码如上,用的是dp,总的来说就是对一个字符串 从末尾开始比较,设定一个数组,存放每个单调字串的最大长度,最后比较... //要注意的就是里面if语句对于每次字符比 ...

  8. TODO、FIXME和XXX转载

    代码中特殊的注释技术——TODO.FIXME和XXX的用处 // TODO Auto-generated method stub

  9. fastUtils学习

    比传统java集合工具类速度更快 google的guava也新增了java容器新的功能,功能更加强大,参考文档:http://www.ibm.com/developerworks/cn/java/j- ...

  10. spring配置文件位置

    参考http://name327.iteye.com/blog/1628884