在函数调用链中捕获异常

时间:2014-01-08 13:35:37

标签: c# exception exception-handling try-catch

哪个/什么是捕获异常的正确位置/方式? Say方法 m1 会抛出异常 e1 。方法 m2 调用 m1 。我应该在 m2 中捕获异常 e1 。或者我可以避免在 m2 中使用try-catch块,如果我知道 m3 调用 m2 并且我在中立方米

try
{
  m2();
}
catch
{
....
}

3 个答案:

答案 0 :(得分:3)

我不认为何时使用try / catch块而不是简单地进一步传播异常有一条硬性规则。但是,作为一般规则,当包含该块的方法可以有效地处理它捕获的异常时,仅使用try / catch块是有意义的。如果你不能对它们采取任何措施,捕获异常是没有意义的。

关于你上面的问题,如果没有合理的方法来处理M2中的异常,但M3中有一个异常,我会继续将异常抛到链上。否则,如果你可以在M2中处理它,那就去吧。

答案 1 :(得分:3)

如果有疑问,请使用以下逻辑:当前方法是否完全能够以潜在调用者不知道异常发生的方式处理异常?

  • 如果是,则捕获并处理方法本身中的异常。
  • 如果没有,那么在异常情况下(记录等),该方法是否有任何未完成或额外的工作?
    • 如果是,则捕获异常,完成工作并重新抛出异常。
    • 如果没有,那么根本不要捕捉异常,而是让它冒泡调用堆栈

简而言之,只有在本地完全能够恢复时才处理异常。

答案 2 :(得分:0)

要问的一个重要问题是“我应该在这里捕捉异常吗?”如果您正在处理像磁盘这样的外部资源,那么答案可能是肯定的,否则它可能没有 - 如果它有错误,它会崩溃你的代码会更好!

遵循上述步骤通常最好尽量减少尝试捕获量,这样您就不会意外地隐藏代码中的任何错误。我想在你的例子中把它放在m1。

这样,您也不必在所有客户端代码中编写try-catches,以获取多次使用的方法。遵循此逻辑,您通常会得到一个结果对象(或者可能更简单地返回null),可以查询是否存在错误。更好的是,如果出现错误但有人试图读取失败操作的结果(如果适用),则可以让此结果对象抛出自己的异常。通过这种方式,您可以使用异常来避免编程错误...只要您不将异常作为控制程序流的方式来捕获。

我确信还有很多关于这个话题的其他意见