zoukankan      html  css  js  c++  java
  • throw和throw ex的区别

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

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

    第一种(不推荐使用),这样适用会吃掉原始异常点,重置堆栈中的异常起始点:

               try

                {

                }

                catch (Exception ex)

                {

                    throw ex;

                }

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

                try

                {

                }

                catch (Exception ex)

                {

                    throw;

                }

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

                try

                {

                }

                catch

                {

                    throw;

                }

    其实第二种和第三种用法,书上也是不建议使用的,一般要从小粒度的异常捕获开始,采用多个catch语句。

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

                try

                {

                }

                catch (Exception ex)

                {

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

                }

    下面用个例子来加以说明:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace EventDemo
    {
        class Program
        {
            /// <summary>
            /// 入口方法
            /// </summary>
            public static void Main()
            {
                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>
        /// 该Class用来测试异常抛出时相关上下文栈的调用情况
        /// </summary>
        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();
            }
        }
    }
    View Code

    从运行的结果可以看到,第一种用法已经吃掉了原始异常信息。而其它3种用法都可以追溯到原始异常,推荐使用第四种用法。

  • 相关阅读:
    Bootstrap-select 动态绑定值
    Centos 下载
    设置图片大小和旋转
    aolication全局传递参数
    Activity静态变量传递参数
    Activity传递参数
    Activity横屏后声明周期的变化
    Intent隐式意图
    Intent显示意图的四种跳转
    SharedPreferences简单的应用
  • 原文地址:https://www.cnblogs.com/scmail81/p/8678571.html
Copyright © 2011-2022 走看看