加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 异常处理类

发布时间:2020-12-16 00:16:14 所属栏目:百科 来源:网络整理
导读:处理异常的最佳实践是什么,而无需在任何地方放置try / catch块? 我有创建一个致力于接收和处理异常的类的想法,但我想知道它是否是一个好的设计理念.这样的类会收到异常然后根据其类型或错误代码决定如何处理它,甚至可以解析堆栈跟踪以获取特定信息等. 以下
处理异常的最佳实践是什么,而无需在任何地方放置try / catch块?

我有创建一个致力于接收和处理异常的类的想法,但我想知道它是否是一个好的设计理念.这样的类会收到异常然后根据其类型或错误代码决定如何处理它,甚至可以解析堆栈跟踪以获取特定信息等.

以下是背后和实施的基本思想:

public class ExceptionHandler
{
    public static void Handle(Exception e)
    {
        if (e.GetBaseException().GetType() == typeof(ArgumentException))
        {
            Console.WriteLine("You caught an ArgumentException.");
        }
        else
        {
            Console.WriteLine("You did not catch an exception."); 
            throw e;   // re-throwing is the default behavior
        }
    }
}

public static class ExceptionThrower
{
    public static void TriggerException(bool isTrigger)
    {
        if (isTrigger)
            throw new ArgumentException("You threw an exception.");
        else
            Console.WriteLine("You did not throw an exception."); 
    }
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            ExceptionThrower.TriggerException(true); 
        }
        catch(Exception e)
        {
            ExceptionHandler.Handle(e);  
        }
        Console.ReadLine(); 
    }
}

我认为这将是一个有趣的尝试,因为理论上你只需要在main()方法调用周围需要一个或很少的try / catch块,并让异常类处理其他所有内容,包括重新抛出,处理,记录等等.

思考?

解决方法

实际上有一个很好的理由让您在生产代码中看不到类似的设计.

首先,这样的设计无法帮助您减少代码中try / catch对的数量(这应该是显而易见的).它可以帮助您减少给定尝试的catch语句数量,因为您可以捕获System.Exception并转发到ExceptionHandler …

但接下来呢?

每个例外都需要以不同的方式处理. ExceptionHandler将如何知道该怎么做?您可以尝试以多种方式解决这个问题,例如:

>从ExceptionHandler派生并将代码放在虚拟方法中处理异常
>传递一些Action< Exception>处理程序的实例并让它调用正确的实例

解决方案(1)会比以前更糟糕:现在你需要为每个try块创建一个全新的类,并覆盖一堆方法,最终得到比以前更糟糕的东西(它不是很清楚代码如何在特定的类中适合您的程序流程).它还会留下另一个未回答的重要问题:您可能需要上下文(访问当前范围中的变量)来正确处理异常.您将如何提供对此上下文的访问权限?

解决方案(2)实际上最终会类似于编写我们一直希望避免的catch块(每个Action实际上都是catch块的内容).我们最终只是以更复杂和冗长的方式做同样的事情.

还有其他问题:

>如果ExceptionHandler无法处理异常,它应该怎么办?再次抛出会导致您丢失原始堆栈跟踪,实际上会破坏其中的所有良好信息.
>如果ExceptionHandler中有错误怎么办?你可以尝试一下try / catch.你能相信你自己编写的代码达到同样的程度吗?

至于ExceptionThrower ……它可能提供什么好处而不是抛出新的Exception();?

异常处理已经是一个复杂的问题,如果不在机器上增加额外的齿轮就很难做到这一点.特别是如果他们不给你买任何新东西.不要这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读