• 抛出异常的区别 throw 和throw ex


    https://www.cnblogs.com/a164266729/p/4913898.html

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

      一般我们推荐throw来抛出异常,使用throw ex来抛出异常会清空存储的异常信息,认为已经处理过异常,只不过在抛出的过程中又产生的新的异常信息,从而找不到真正的错误源。

      第一种 使用的人数最多,但是不推荐使用,这样处理异常程序会清空堆栈中的异常信息,在堆栈中重置异常点。

    复制代码
    1 try
    2 {
    3 }
    4 catch (Exception ex)
    5 {
    6 throw ex;
    7 }
    复制代码
      第二种 这种会追溯到异常的起源点,但是程序会报 定义的ex未被使用的警告

    复制代码
    1 try
    2 {
    3 }
    4 catch (Exception ex)
    5 {
    6 throw;
    7 }
    复制代码
      第三种 这中方式和第二种相同 可以捕获所有的异常,IDE也不会警告

    复制代码
    1 try
    2 {
    3 }
    4 catch
    5 {
    6 throw;
    7 }
    复制代码
      第四种 对异常重新包装,但同时保留了异常的起源点。  

    复制代码
    1        try
    2 {
    3 }
    4 catch (Exception ex)
    5 {
    6 throw new Exception("经过进一步包装的异常", ex);
    7 }
    复制代码
      下边我们看具体使用过成中各种抛出异常的使用方法,对各种方法就会有了清晰的认识

    复制代码
    1 using System;
    2
    3 namespace Throw
    4 {
    5 class Program
    6 {
    7 static void Main(string[] args)
    8 {
    9 ExceptionClass ec = new ExceptionClass();
    10
    11 try
    12 {
    13 ec.ExceptionThrow1();
    14 }
    15 catch (Exception ex)
    16 {
    17
    18 Console.WriteLine(ex.ToString());
    19 }
    20 Console.WriteLine("----------------------华丽的分割线---------------------------");
    21 try
    22 {
    23 ec.ExceptionThrow2();
    24 }
    25 catch (Exception ex)
    26 {
    27
    28 Console.WriteLine(ex.ToString());
    29 }
    30 Console.WriteLine("----------------------华丽的分割线---------------------------");
    31 try
    32 {
    33 ec.ExceptionThrow3();
    34 }
    35 catch (Exception ex)
    36 {
    37
    38 Console.WriteLine(ex.ToString());
    39 }
    40 Console.WriteLine("----------------------华丽的分割线---------------------------");
    41 try
    42 {
    43 ec.ExceptionThrow4();
    44 }
    45 catch (Exception ex)
    46 {
    47
    48 Console.WriteLine(ex.ToString());
    49 }
    50 Console.WriteLine("----------------------华丽的分割线---------------------------");
    51
    52 Console.ReadKey();
    53 }
    54 }
    55
    56 ///


    57 /// 测试上下文抛出异常 相关上下文 栈的调用情况
    58 ///

    59 public class ExceptionClass
    60 {
    61
    62 private void ExceptionMethod()
    63 {
    64 throw new DivideByZeroException();
    65 }
    66
    67 ///
    68 /// 抛出异常的方法
    69 ///

    70 public void ExceptionThrow1()
    71 {
    72 try
    73 {
    74 this.ExceptionMethod();
    75 }
    76 catch (Exception ex)
    77 {
    78 throw ex;
    79 }
    80 }
    81
    82 public void ExceptionThrow2()
    83 {
    84 try
    85 {
    86 this.ExceptionMethod();
    87 }
    88 catch (Exception ex)
    89 {
    90
    91 throw;
    92 }
    93 }
    94
    95 public void ExceptionThrow3()
    96 {
    97 try
    98 {
    99 this.ExceptionMethod();
    100 }
    101 catch (Exception)
    102 {
    103
    104 throw;
    105 }
    106 }
    107
    108 public void ExceptionThrow4()
    109 {
    110 try
    111 {
    112 this.ExceptionMethod();
    113 }
    114 catch (Exception ex)
    115 {
    116
    117 throw new Exception("经过进一步包装的异常",ex);
    118 }
    119 }
    120 }
    121 }
    复制代码
    程序运行结果

  • 相关阅读:
    【解决火车轮播图小圆点跳的问题】传统轮播图-三位法
    jq龙禧轮播图
    QT MSVC环境中添加QWT
    XDMA ip core的使用
    PCIe基础知识与例程分析----PIO_demo
    Day04 (四)_TCP文件传输设计
    Day04 (三)_UDP传输端设计
    Day04 (二)_TCP传输客户器端设计
    Day04 (一)_TCP传输服务器端设计
    Day03 (下)_Qt文件系统
  • 原文地址:https://www.cnblogs.com/ellafive/p/15936883.html
Copyright © 2020-2023  润新知