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

所以我今天早上碰到一些代码,看起来像这样:

try { x = SomeThingDangerous(); return x; } catch (Exception ex) { throw new DangerousException(ex); } finally { CleanUpDangerousStuff(); } 

现在这个代码编译得很好,按照它应该的方式工作,但是从try块中返回是不正确的,尤其是如果最后有关联的话。

我的主要问题是如果终于抛出它自己的exception会发生什么? 你有一个返回的variables,但也是一个例外,所以我很想知道别人怎么想从try块中返回?

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

无论如何,终于无可挑剔,所以没关系。

就我个人而言,我会避免这种编码,因为我不想在最后的陈述之前看到返回语句。

我的思想很简单,它处理的东西相当线性。 因此,当我通过代码干运行时,我会倾向于认为,一旦我能够达到return语句,所有的事情都不重要,在这种情况下显然是非常错误的(不会影响return语句,但是什么副作用可能是)。

因此,我会安排代码,以便return语句总是出现在finally语句之后。

这可能会回答你的问题

真的发生了什么{try {return x; } finally {x = null; }声明?

从阅读这个问题,听起来像你可以在finally语句中有另一个try catch结构,如果你认为它可能会抛出一个exception。 编译器会计算出什么时候返回值。

也就是说,不pipe怎样重构你的代码可能会更好,因为它不会让你后来感到困惑,或者别人也可能不知道这一点。

function上没有区别。

但是有一个不这样做的原因。 具有多个出口点的较长方法往往更难以阅读和分析。 但是,这种反对意味着更多的回报声明,而不是最终的阻止。

在你的例子中,任何一种方法都是等价的,如果编译器生成相同的代码,我甚至不会感到惊讶。 如果在finally块中发生exception,则无论是将return语句放在块还是外部,都有相同的问题。

真正的问题是最好的风格。 我喜欢写我的方法,以便只有一个返回语句,这样就更容易看到stream出的方法,因此,我也喜欢把返回语句放在最后,所以很容易看出它是该方法的结束,这是什么它返回。

我认为,随着最后声明的回归声明如此整齐,其他人不太可能将多个回报声明放到方法的其他部分。

看到这也是https://stackoverflow.com/a/421827/344822 。 在这里,jon飞龙的答案不仅仅是澄清你的疑问,它还提供了一些更多的信息。