• 使用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。

  • 相关阅读:
    (II)第一节:IOC 和 DI
    (I)第二节:开发环境
    (I)第一节:Spring 框架
    Spring【目录】
    MyBatisPlus 之 Oracle 数据库主键
    MyBatisPlus 之 公共字段自动填充
    MyBatisPlus 之 全局SQL注入器应用
    MyBatisPlus 之 自定义全局操作
    MyBatisPlus 之 代码生成器
    彻底理解Netty
  • 原文地址:https://www.cnblogs.com/liweis/p/16002217.html
Copyright © 2020-2023  润新知