最後或只是程式碼?
重要性: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
的尾端,它不會在這些情況下執行。