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。

結語

只是一個很小的細節。但也願望列位看官好好應用這類特徵。

    原文作者:原罪
    原文地址: https://segmentfault.com/a/1190000015196493
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞