处理异常,这是一个好方法吗?

Jor*_*oba 28 .net c# exception-handling

我们正在努力使用策略来正确处理应用程序中的异常.这是我们的目标(总结):

  • 仅处理特定的例外情况.
  • 只处理您可以纠正的异常
  • 只记录一次.

我们已经提出了一个涉及通用特定于应用程序特定异常的解决方案,并且在一段代码中就是这样的:

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)
}
Run Code Online (Sandbox Code Playgroud)

记录所有异常,然后转为AppSpecificException,以便不再记录它.最终它将到达最后的手段事件处理程序,如果必须,将处理它.

我对异常处理模式没有太多经验......这是解决我们目标的好方法吗?它有任何重大缺点或大红色警告吗?

注意:这样做的一个缺点是,在第一次捕获之后你将失去处理特定异常的能力(如果你调用一个调用另一个方法的方法而第二个抛出异常则你无法处理它)但是我发现我从来没有这样做过......我只处理一个深度的例外...

Joh*_*ers 60

如果您在异常第一次抛出异常时记录异常,则不会记录完整的堆栈跟踪.

处理异常(即修复它们),尽可能接近它们被抛出的时间.尽快收集有关上下文的信息.但允许异常传播到实际可以处理的位置.日志记录是最后一种处理方式,因此应该在应用程序子系统的外层中进行.

这样就不需要使用特定于应用程序的异常作为标记来记录不应该开始捕获的异常.

  • @Jorge:当异常遍历堆栈级别时,会添加堆栈跟踪.它是"到目前为止"的堆栈跟踪. (4认同)
  • +1这是最好的建议 - 我希望我可以两次投票! (4认同)
  • +1如果您使用问题中提出的模式,我强烈怀疑您会后悔.实际上,与登录应用程序层相比,它需要大量不必要的代码. (2认同)

Jus*_*tin 6

不记录异常然后重新抛出 - 调用者负责处理/记录您生成的任何异常.

仅捕获异常以处理它(例如记录它),或添加特定于上下文的信息.