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。
結語
只是一個很小的細節。但也希望各位看官好好利用這種特性。
相關文章
- JavaScript的執行順序JavaScript
- Sql執行順序SQL
- JavaScript執行順序分析JavaScript
- 任務執行順序
- for語句執行順序
- laravel Event執行順序Laravel
- mySQL 執行語句執行順序MySql
- 關於 Promise 的執行順序Promise
- Spring Aop的執行順序Spring
- SQL 語句的執行順序SQL
- CSS規則的執行順序CSS
- Java類的基本執行順序Java
- SQL 執行順序 你懂的SQL
- sql mysql 執行順序 (4)MySql
- SQL語句執行順序SQL
- js執行順序Event LoopJSOOP
- JavaScript for迴圈 執行順序JavaScript
- JavaScript 執行順序淺析JavaScript
- 路由的中介軟體執行順序路由
- DISTINCT 和 TOP合用的執行順序
- 警惕執行緒的優先順序執行緒
- Linux c多執行緒執行順序Linux執行緒
- 聊聊如何讓springboot攔截器的執行順序按我們想要的順序執行Spring Boot
- js解惑-函式執行順序JS函式
- Select語句執行順序
- 命令執行順序控制與管道
- java執行緒優先順序Java執行緒
- JUnit 標籤執行順序解析
- 執行緒執行順序——CountDownLatch、CyclicBarrier 、join()、執行緒池執行緒CountDownLatch
- Unity3D中指令碼的執行順序和編譯順序Unity3D指令碼編譯
- SQL語句各子句的執行順序SQL
- C#類中方法的執行順序C#
- Java之執行緒的優先順序Java執行緒
- 可看執行順序的xplan.package.sqlPackageSQL
- profile,rcfile的搜尋執行順序(轉)
- Jmeter的元件作用域和執行順序JMeter元件
- 【高併發】深入理解執行緒的執行順序執行緒
- Java中如何保證執行緒順序執行Java執行緒