c# – 异常处理类
处理异常的最佳实践是什么,而无需在任何地方放置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派生并将代码放在虚拟方法中处理异常 解决方案(1)会比以前更糟糕:现在你需要为每个try块创建一个全新的类,并覆盖一堆方法,最终得到比以前更糟糕的东西(它不是很清楚代码如何在特定的类中适合您的程序流程).它还会留下另一个未回答的重要问题:您可能需要上下文(访问当前范围中的变量)来正确处理异常.您将如何提供对此上下文的访问权限? 解决方案(2)实际上最终会类似于编写我们一直希望避免的catch块(每个Action实际上都是catch块的内容).我们最终只是以更复杂和冗长的方式做同样的事情. 还有其他问题: >如果ExceptionHandler无法处理异常,它应该怎么办?再次抛出会导致您丢失原始堆栈跟踪,实际上会破坏其中的所有良好信息. 至于ExceptionThrower ……它可能提供什么好处而不是抛出新的Exception();? 异常处理已经是一个复杂的问题,如果不在机器上增加额外的齿轮就很难做到这一点.特别是如果他们不给你买任何新东西.不要这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |