try-catch-finally,被你忽略掉的執行順序
try-catch是捕捉異常的神器,不管是除錯還是防止軟體崩潰,都離不開它。今天筆者介紹一下加上finally後的執行順序
function test() { try { console.log(1); } finally { console.log(2); } } console.log(test()); // 1 2
嗯!按順序執行了。
我們在try中加入return語句
function test() { 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優先輸出。
我們在finally中也加入return語句
function test() { 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了。
現在筆者在try語句塊中故意報錯
function test() { try { console.log(1); throw new Error('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。
結語
只是一個很小的細節。但也希望各位看官好好利用這種特性。
相關文章
- [Java基礎]try-catch-finally 和 return 的執行順序Java
- pipeline的執行順序
- Sql執行順序SQL
- Spring Aop的執行順序Spring
- JavaScript執行順序分析JavaScript
- mySQL 執行語句執行順序MySql
- mysql 語句的執行順序MySql
- 關於 Promise 的執行順序Promise
- SQL 語句的執行順序SQL
- 聊聊如何讓springboot攔截器的執行順序按我們想要的順序執行Spring Boot
- Select語句執行順序
- sql mysql 執行順序 (4)MySql
- SQL語句執行順序SQL
- js執行順序Event LoopJSOOP
- 路由的中介軟體執行順序路由
- Pytest 順序執行,依賴執行,引數化執行
- [20191215]seq控制執行順序.txt
- sql select語法執行順序SQL
- async await、Promise、setTimeout執行順序AIPromise
- js解惑-函式執行順序JS函式
- Jmeter的元件作用域和執行順序JMeter元件
- C#類中方法的執行順序C#
- 令人費解的 async/await 執行順序AI
- SQL語句各子句的執行順序SQL
- Java之執行緒的優先順序Java執行緒
- 【高併發】深入理解執行緒的執行順序執行緒
- Java中如何保證執行緒順序執行Java執行緒
- join、volatile、newSingleThreadLatch 實現執行緒順序執行thread執行緒
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- kafka多執行緒順序消費Kafka執行緒
- [20191112]flock控制命令執行順序.txt
- unittest--TestCase 按宣告順序執行
- Go包中程式碼執行順序Go
- 利用訊號量實現執行緒順序執行執行緒
- Hive SQL語句的正確執行順序HiveSQL
- SQL 查詢語句的執行順序解析SQL
- Java for迴圈中語句執行的順序Java
- SQL語句中的AND和OR執行順序問題SQL