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种用法都可以追溯到原始异常,推荐使用第四种用法。

  • 相关阅读:
    11111 Generalized Matrioshkas
    Uva 442 Matrix Chain Multiplication
    Uva 10815 Andy's First Dictionary
    Uva 537 Artificial Intelligence?
    Uva 340 MasterMind Hints
    SCAU 9508 诸葛给我牌(水泥题)
    Uva 10420 List of Conquests(排序水题)
    Uva 409 Excuses, Excuses!
    10/26
    11/2
  • 原文地址:https://www.cnblogs.com/scmail81/p/8678571.html
Copyright © 2011-2022 走看看