最后还是只有代码?
重要性:5
比较这两个代码片段。
-
第一个使用
finally
在try...catch
后执行代码try { work work } catch (err) { handle errors } finally { cleanup the working space }
-
第二个片段将清理代码放在
try...catch
之后try { work work } catch (err) { handle errors } cleanup the working space
我们肯定需要在工作完成后进行清理,无论是否发生错误。
在这里使用finally
有什么优势,还是两个代码片段是等效的?如果有优势,请举例说明它何时重要。
当我们查看函数内部的代码时,差异变得显而易见。
如果存在从try...catch
“跳出”,则行为不同。
例如,当try...catch
内部存在return
时。finally
子句在任何从try...catch
退出时都有效,即使通过return
语句:在try...catch
完成之后,但在调用代码获得控制之前。
function f() {
try {
alert('start');
return "result";
} catch (err) {
/// ...
} finally {
alert('cleanup!');
}
}
f(); // cleanup!
…或者当存在throw
时,例如这里
function f() {
try {
alert('start');
throw new Error("an error");
} catch (err) {
// ...
if("can't handle the error") {
throw err;
}
} finally {
alert('cleanup!')
}
}
f(); // cleanup!
是finally
保证了这里的清理。如果我们只是将代码放在f
的末尾,它在这些情况下将不会运行。