try-catch-finally,被你忽略掉的執行順序

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

結語

只是一個很小的細節。但也但願各位看官好好利用這種特性。軟件

相關文章
相關標籤/搜索