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

  一般我们推荐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. 利用CSS边框合并属性打造table细边框

    CSS代码: <style> table{ border-collapse: collapse;/* 边框合并属性 */ width:200px; } th{ border: 1px so ...

  2. STL之hash_set和hash_map

    Contents 1 hash_set和hash_map的创建与遍历 2 hash_set和hash_map的查找 3 建议 一句话hash_set和hash_map:它们皆由Hashtable(St ...

  3. Injecting and Binding Objects to Spring MVC Controllers--转

    I have written two previous posts on how to inject custom, non Spring specific objects into the requ ...

  4. ·数据库基本内容回顾-day16.06.30

    一. 模式的定义和删除  ---创建了一个模式,就创建了一个数据库命名空间,一个框架.cascade.restrict create schema<模式名> authorization & ...

  5. Python基础练习

    近日,因工作需要要学习Python.为了不在语言细节中无法自拔,我按照网上广为流传的<程序员技术练级攻略>中python部分的学习计划,做了三个简单的练习,算是对python有了初步的了解 ...

  6. Linux samba服务器设置简单匿名共享

    linux下面的samba非常的好用,很多人拿它来作共享文件服务器, 缺省配置下,samba必须提供用户名密码来访问,如果是所有人都可以访问的内容,那么是比较麻烦的,其实通过一个设置,即可实现不用输入 ...

  7. 没有找到iertutil.dll怎么办?快速解决iertutil.dll丢失

    iertutil.dll 是存放在 C:\Windows\System32 目录下的一个动态链接库文件,它提供函数给其他程序所调用.iertutil.dll 能够实现接到互联网,纪录输入,监控应用程序 ...

  8. 常用语句1【weber出品】

    1.查看控制文件位置: select * from v$controlfile show parameter control; 2.查询日志文件位置  select group#,status,mem ...

  9. 《Linux内核分析》 week2作业-时间片轮转

    一.基于时间片轮转调度代码的解读 代码结构主要由三个文件组成: 1.mypcb.h 2.myinterrupt.c 3.mymain.c 1.进程控制块(mypcb.h) /* CPU-specifi ...

  10. Ecshop布局参考图

    文章列表页: article_cat.dwt 文章内容页: article.dwt 商品品牌页: brand.dwt 所有分类页: catalog.dwt 商品列表页: category.dwt 商品 ...