从 try catch finally 块中返回是不好的做法吗?

Posted

技术标签:

【中文标题】从 try catch finally 块中返回是不好的做法吗?【英文标题】:Is it bad practice to return from within a try catch finally block? 【发布时间】:2010-10-01 17:40:13 【问题描述】:

所以今天早上我遇到了一些看起来像这样的代码:

try

    x = SomeThingDangerous();
    return x;

catch (Exception ex)

    throw new DangerousException(ex);

finally

    CleanUpDangerousStuff();

现在这段代码可以正常编译并且可以正常工作,但是从 try 块中返回感觉不合适,尤其是如果有关联的 finally。

我的主要问题是如果 finally 抛出它自己的异常会发生什么?你有一个返回的变量,但也有一个要处理的异常......所以我很想知道其他人对从 try 块中返回的想法?

【问题讨论】:

这种风格的一个好处是您不必在try 块之外声明x。你可以保持它的声明接近它的用途。 【参考方案1】:

不,这不是一个坏习惯。将return 放在有意义的地方可以提高可读性和可维护性,并使您的代码更易于理解。如果遇到return 语句,您不应该关心finally 块将被执行。

【讨论】:

【参考方案2】:

finally 无论如何都会被执行,所以没关系。

【讨论】:

不,其实不只是拔掉,还有一些异常叫做异步异常,比如 ***Exception、ThreadAbortException 和 OutOfMemoryException 可能会导致 finally 块不被执行。阅读有关处理这些场景的受限执行区域。 这些链接解释它:return Statement 和 try...catch...finally Statement【参考方案3】:

就个人而言,我会避免这种编码,因为我不想在 finally 语句之前看到 return 语句。

我的头脑很简单,它处理事情的方式相当线性。因此,当我浏览干运行的代码时,我会倾向于认为一旦我可以到达 return 语句,接下来的一切都无关紧要,这在这种情况下显然是非常错误的(不是它会影响 return 语句,而是副作用可能是什么)。

因此,我会安排代码以使 return 语句始终出现在 finally 语句之后。

【讨论】:

【参考方案4】:

这可能会回答你的问题

What really happens in a try return x; finally x = null; statement?

通过阅读该问题,如果您认为它可能会引发异常,听起来您可以在 finally 语句中使用另一个 try catch 结构。编译器会判断何时返回值。

也就是说,无论如何,最好还是重新构建您的代码,以免以后让您或其他可能不知道这一点的人感到困惑。

【讨论】:

嗯非常有趣。所以这意味着它是安全的,但这是否意味着应该避免它? 我个人认为它使您的代码的可读性有点困难,仅此一点就足以让我想出一些其他的方式来构建代码。但实际上这只是个人喜好。 我倾向于同意你的个人喜好:) 我认为回报是好的。该方法将返回该值,除非抛出异常;最终清理代码中是否出现异常无关紧要。 请注意,从 finally 返回的限制在 Java 中存在(但我认为限制是一个很好的限制 - 对 C# 的赞誉)。【参考方案5】:

功能上没有区别。

但是,不这样做是有原因的。具有多个退出点的较长方法通常更难以阅读和分析。但这种反对更多地与 return 语句有关,而不是 catch 和 finally 块。

【讨论】:

我会挑战这一点,因为你最终可能会得到更多的嵌套,这也使得阅读更高的圈复杂度变得更加困难【参考方案6】:

在您的示例中,任何一种方式都是等效的,如果编译器生成相同的代码,我什至不会感到惊讶。如果在 finally 块中发生异常,无论将 return 语句放在块中还是在块之外,都会遇到相同的问题。

真正的问题是风格上哪个最好。我喜欢把我的方法写成只有一个return语句,这样更容易看到方法的流出,所以我也喜欢把return语句放在最后,这样很容易看出它是方法的结尾以及它返回的内容。

我认为将 return 语句作为最后一个语句放置得如此整齐,其他人不太可能来将多个 return 语句分散到方法的其他部分。

【讨论】:

以上是关于从 try catch finally 块中返回是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

try--catch--finally中return返回值执行的顺序

try--catch--finally中return返回值执行的顺序(区别)

Java中try catch finally语句中含有return语句的执行情况

Java中try catch finally语句中含有return语句的执行情况(总结版)

try catch finally语句块中存在return语句时的执行情况剖析

try-catch- finally块中, finally块唯一不执行的情况是什么?