c# - 异常处理类

标签 c# exception try-catch rethrow

在不必到处放置 try/catch block 的情况下处理异常的最佳实践是什么?

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

这是背后的基本思想和实现:

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 block ,并让异常类处理所有其他事情,包括重新抛出、处理、记录、任何。

想法?

最佳答案

没有在生产代码中看到类似设计实际上是有充分理由的。

首先,这样的设计不能帮你减少try的数量。/catch在你的代码中配对(这应该是显而易见的)。它可以帮助您减少 catch 的数量给定 try 的陈述, 因为你可以捕获 System.Exception并转发到 ExceptionHandler ...

但是接下来呢?

每个异常都需要以不同的方式处理。 ExceptionHandler会怎样确切地知道该怎么做?您可以尝试通过多种方式解决此问题,例如:

  1. 来自 ExceptionHandler并将处理异常的代码放在虚方法中
  2. 传递一些 Action<Exception>处理程序的实例并让它调用正确的实例

解决方案 (1) 会比之前的更糟糕:现在您需要为每个 try 创建一个全新的类阻止并重写一堆方法,以得到比以前更糟糕的结果(目前还不清楚特定类中的代码如何适合您的程序流)。它还会留下另一个 Unresolved 重要问题:您可能需要上下文(访问当前范围内的变量)才能正确处理异常。您将如何提供对此上下文的访问权限?

解决方案 (2) 实际上与编写 catch 非常相似我们一直想避免的 block (每个 Action 实际上都是 catch block 的内容)。我们最终做同样的事情,只是以更复杂和冗长的方式。

还有其他问题:

  • 应该做什么ExceptionHandler如果它不能处理异常怎么办?再次抛出它会导致您丢失原始堆栈跟踪,实际上会破坏其中所有有用的信息。
  • 如果 ExceptionHandler 中有错误怎么办? ?你可以相信 try/catch .您能以同样的程度信任您自己编写的代码吗?

至于ExceptionThrower ... 它可能比 throw new Exception(); 提供什么好处? ?

异常处理已经是一件复杂的事情了,如果不给机器增加额外的齿轮就很难把它做好。特别是如果他们不给你买任何新东西。 不要这样做。

关于c# - 异常处理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573814/

相关文章:

c# - 处理来自另一个函数的异常

c# - 计算 Minecraft 爆炸

c# - 在 C# 中为包含特殊字符的 Blob 路径生成 SAS token 时出现问题

c# - 抑制对象终结,直到其他线程运行

c# - 如果从 using 语句中抛出异常,是否仍会调用清理逻辑?

objective-c - 如何在 Xcode 4.2 上启用 Objective-C 异常?

java - 阻止 ArrayOutOfBoundsException 在 Java 中停止程序执行

C# String.Format '{' 字符

java - 尝试打开与 http URL 的连接时出现 IOException

ruby - 如何在 ruby​​ 回溯中获取源和变量值?