在不必到处放置 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
会怎样确切地知道该怎么做?您可以尝试通过多种方式解决此问题,例如:
- 来自
ExceptionHandler
并将处理异常的代码放在虚方法中 - 传递一些
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/