try-catch是捕捉異常的神器,無論是調試仍是防止軟件崩潰,都離不開它。今天筆者介紹一下加上finally後的執行順序spa
functiontest() {
try {
console.log(1);
} finally {
console.log(2);
}
}
console.log(test()); // 1 2
複製代碼
嗯!按順序執行了。調試
咱們在try中加入return語句code
functiontest() {
try {
console.log(1);
return'from_try';
} catch (e) {
// TODO
} finally {
console.log(2);
}
}
console.log(test()); // 1 2 from_try
複製代碼
等等,難道不該該是 1 > from_try > 2
的順序嗎? 抱歉啊,是這樣的,在try和catch的代碼塊中,若是碰到return語句,那麼在return以前,會先執行finally
中的內容,因此2會比from_try優先輸出。io
咱們在finally中也加入return語句console
functiontest() {
try {
console.log(1);
return'from_try';
} catch (e) {
// TODO
} finally {
console.log(2);
return'from_finally';
}
}
console.log(test()); // 1 2 from_finally
複製代碼
買噶的,個人from_try怎麼不見了? 抱歉,按照上一條的規則,finally是會優先執行的,因此若是finally裏有return語句,那麼就真的return了。function
如今筆者在try語句塊中故意報錯class
functiontest() {
try {
console.log(1);
thrownewError('throw');
} catch (e) {
console.log(e.message);
return'from_catch';
} finally {
console.log(2);
}
}
console.log(test()); // 1 throw 2 from_catch
複製代碼
看來,try和catch的return都須要先通過finally。test
只是一個很小的細節。但也但願各位看官好好利用這種特性。軟件