• 使用InnerException传递异常


    在编程中,异常处理是必须掌握的基本内容,这里我们来讨论一下自定义异常的使用注意事项。先通过三个简单的例子来说明:

    不处理异常

    最常见的情况,在主函数Main中调用封装的Fun功能,在Fun函数中不做任何异常处理。

    namespace ConsoleApp1
    {
        class Program
        {
            private static double Fun(int x, int y)
            {
                    return x / y;    //未做任务异常处理
            }
            
            static void Main(string[] args)
            {
                try
                {
                    Fun(10, 0);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message + ex.StackTrace);
                }
            }
        }
    }

    根据堆栈位置,可检索到错误行。报错如下:

    尝试除以零。

    在 ConsoleApp1.Program.Fun(Int32 x, Int32 y) 位置 C: \ ConsoleApp1\Program.cs:行号 7

    在 ConsoleApp1.Program.Main(String[] args) 位置 C: \ConsoleApp1\Program.cs:行号 14

    自定义异常

    为了增加程序的健壮性,Fun函数了增加了Try-Catch,并throw抛出了自定义异常。

    namespace ConsoleApp1
    {
        class Program
        {
            private static double Fun(int x, int y)
            {
                try
                {
                    return x / y;  
                }
                catch (Exception ex)
                {
                    //增加了try- catch,并抛出自定义的Exception
                    throw new Exception($"函数错误:{ex.Message}");
                }
            }
            
            static void Main(string[] args)
            {
                try
                {
                    Fun(10, 0);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message + ex.StackTrace);
                }
                Console.ReadLine();
            }
        }
    }
    

    通过此番操作,能够明确出错的位置在Fun函数内,但无法判断具体的问题了。报错如下:

    函数错误:尝试除以零。

    在 ConsoleApp1.Program.Fun(Int32 x, Int32 y) 位置 C:\ConsoleApp1\Program.cs:行号 14

    在 ConsoleApp1.Program.Main(String[] args) 位置 C:\ConsoleApp1\Program.cs:行号 22

    异常传递

    将Fun函数中的异常传递出来:

    namespace ConsoleApp1
    {
        class Program
        {
            private static double Fun(int x, int y)
            {
                try
                {
                    return x / y;
                }
                catch (Exception ex)
                {
    //将异常作为InnerException传递出去
                    throw new Exception($"函数错误:{ex.Message}",ex);
                }
            }
            
            static void Main(string[] args)
            {
                try
                {
                    Fun(10, 0);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message + ex.StackTrace);
                    Console.WriteLine(ex.InnerException.Message + ex.InnerException.StackTrace);
                }
                Console.ReadLine();
            }
        }
    }
    

    自定义异常时,使用InnerException将异常传递出来,也可以进行定位。

    函数错误:尝试除以零。

    在 ConsoleApp1.Program.Fun(Int32 x, Int32 y) 位置 C:\ConsoleApp1\Program.cs:行号 14

    在 ConsoleApp1.Program.Main(String[] args) 位置 C:\ConsoleApp1\Program.cs:行号 22

    尝试除以零。

    在 ConsoleApp1.Program.Fun(Int32 x, Int32 y) 位置 C:\ConsoleApp1\Program.cs:行号 9

    小结

    通过上面的测试对比,可得出以下结论:

    要么不throw,抛出自定义异常时,最好使用异常传递。

    愿天下程序没有Bug。

  • 相关阅读:
    关于ThreadLocal的理解
    常用Linux软件安装
    Spring事务注解@Transactional失效的问题
    使用jackson转换xml格式数据进行响应
    创建简单web程序了解servlet
    JDBC
    StringBuild类
    Canlendar 日期类
    Java Date 时间类的使用
    QWeb
  • 原文地址:https://www.cnblogs.com/liweis/p/16002217.html
Copyright © 2020-2023  润新知