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

  • 相关阅读:
    html,css,js实现的一个钟表
    CSS子元素在父元素中水平垂直居中的几种方法
    JavaScript去除字符串中的空格
    JavaScript判断数据类型的4中方法
    数据库的创建和删除
    MySql数据类型及对应存储空间
    配置hibernate常见问题
    java 获取系统变量(环境变量和设置变量)
    IDEA创建Web项目(基于Maven多模块)
    spring boot快速搭建
  • 原文地址:https://www.cnblogs.com/scmail81/p/8678571.html
Copyright © 2011-2022 走看看