在函数调用链中捕获异常



捕获异常的正确位置/方式是什么?假设方法m1抛出异常e1。方法m2调用m1。我应该在m2中捕获异常e1吗。或者,如果我知道m3调用m2,并且我在m3中有

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

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

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

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

我不认为在何时使用try/catch块而不是简单地进一步传播异常方面有硬性规定。然而,作为一般规则,只有当包含try/catch块的方法能够有效地处理它捕获的异常时,才使用该块是有意义的。如果你不能对异常做任何事情,那么捕捉它们是没有意义的。

关于你上面的问题,如果在M2中没有合理的方法来处理异常,但在M3中有一个,我会继续把异常抛出链。否则,如果你能在M2中处理它,就去争取它

要问的一个重要问题是"我应该在这里捕捉异常吗?"如果你处理的是像磁盘这样的外部资源,那么答案可能是肯定的,否则可能是否定的——如果你的代码在出现错误时崩溃,那就更好了!

根据以上内容,通常最好尽可能减少try捕获,这样就不会意外地在代码中隐藏任何错误。我认为在你的例子中,它是m1。

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

我相信对这个话题还有很多其他的看法

最新更新