try / catch块中的return语句如何工作?
function example() {
try {
return true;
}
finally {
return false;
}
}
我期望此函数的输出为true
,但实际上是false
!
Answers:
最后总是执行。这就是它的用途,这意味着您的情况将使用返回值。
您将需要更改代码,因此更像这样:
function example() {
var returnState = false; // initialisation value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
一般来说,您从不希望一个函数中有多个return语句,这就是为什么。
根据ECMA-262(第5版,2009年12月),第96页:
生产
TryStatement : try Block Finally
评估如下:
- 令B为评估Block的结果。
- 令F为最终评估的结果。
- 如果F.type正常,则返回B。
- 返回F。
从第36页起:
完成类型用于解释语句(行为
break
,continue
,return
和throw
)来实现控制的非局部传输。于完成类型的值的形式为三元组(类型,值,目标),其中式是以下之一normal
,break
,continue
,return
,或throw
,值是任何ECMAScript语言值或空的,并且目标是任何的ECMAScript标识符或清空。
很明显,return false
将设置完成类型最后作为回报,导致try ... finally
做4.返回˚F。
据我所知,无论内部是否有语句,该finally
块始终会执行。因此,您将获得finally块中的语句返回的值。return
try
return
我在Ubuntu中都使用Firefox 3.6.10和Chrome 6.0.472.63对此进行了测试。此代码在其他浏览器中的行为可能会有所不同。
我在这里给出一个略有不同的答案:是的,try
和finally
块都被执行,并且finally
优先于函数的实际“返回”值。但是,这些返回值并不总是在您的代码中使用。
原因如下:
res.send()
Express.js,后者将创建HTTP响应并将其分派。try
和finally
块都将执行此功能,如下所示:try {
// Get DB records etc.
return res.send('try');
} catch(e) {
// log errors
} finally {
return res.send('finally');
}
此代码将try
在您的浏览器中显示字符串。另外,该示例将在您的控制台中显示错误。该res.send()
函数被调用两次。这将发生在具有功能的任何事物上。try-catch-finally块会将这个事实混淆到未经训练的眼睛,因为(个人)我只将return
值与功能范围关联。
恕我直言,你最好的选择是从来没有使用return
一个内部finally
块。它将使您的代码过于复杂,并可能掩盖错误。
实际上,PHPStorm中有一个默认的代码检查规则设置,为此提供了“警告”:
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
finally
什么呢?我只会用它finally
来清理东西。对于函数的返回值不重要的任何事情。
如果考虑一下,这可能是有道理的,因为当您依赖之下的代码行时finally
,您假设try
或中可能有错误catch
。但是最后两个是错误处理的实际构建块。只需使用return
in try
和即可catch
。
从finally块返回
如果
finally
-block返回一个值,则此值将成为整个try-catch-finally
语句的返回值,而不管and -blocks中的任何return
语句如何。try
catch
最后,应该总是在try catch块的末尾运行,以便(按规范)是为什么返回false的原因。请记住,不同的浏览器完全有可能具有不同的实现。