我们正在努力制定一项政策,以正确处理应用程序中的异常。这是我们的目标(概述):
我们提供了一个解决方案,该解决方案涉及一个通用的Application Specific Exception,并在一段代码中像这样工作:
try { // Do whatever } catch(ArgumentNullException ane) { // Handle, optinally log and continue } catch(AppSpecificException) { // Rethrow, don't log, don't do anything else throw; } catch(Exception e) { // Log, encapsulate (so that it won't be logged again) and throw Logger.Log("Really bad thing", e.Message, e); throw new AppSpecificException(e) }
将记录所有异常,然后将其转换为AppSpecificException,以便不再记录该异常。最终,它将到达必须采取的最后处理方法。
我对异常处理模式没有太多经验,这是解决我们目标的好方法吗?是否有重大缺陷或大红色警告?
注意:这样 做的缺点之一是,在第一次捕获后,您将失去处理特定异常的能力(如果您调用的方法调用了另一个方法,而第二个方法抛出了异常,则您将无法处理该异常),但是我发现我从未做过任何事情…我只处理一个深度级别的异常…
如果您在第一次引发异常时就记录了异常,则不会记录完整的堆栈跟踪。
处理 异常(即修复异常),使其尽可能接近引发异常的时间。尽早收集有关上下文的信息。但是,允许异常传播到实际可以处理的地方。日志记录是最后一种处理方式,因此应在应用程序子系统的外层进行。
这应该消除了将特定于应用程序的异常用作标记的必要性,以不记录最初不应该捕获的异常。