返回課程

最後或只是程式碼?

重要性:5

比較兩個程式碼片段。

  1. 第一個使用 finallytry...catch 後執行程式碼

    try {
      work work
    } catch (err) {
      handle errors
    } finally {
      cleanup the working space
    }
  2. 第二個片段將清除動作放在 try...catch 之後

    try {
      work work
    } catch (err) {
      handle errors
    }
    
    cleanup the working space

我們絕對需要在工作後進行清除,無論是否有錯誤。

使用 finally 有優勢嗎?還是兩個程式碼片段相同?如果有這樣的優勢,請舉例說明何時重要。

當我們檢視函數內部的程式碼時,差異就變得明顯。

如果「跳出」try...catch,行為會有所不同。

例如,當 try...catch 內部有 return 時。finally 子句會在從 try...catch 任何離開的情況下運作,即使是透過 return 陳述式:在 try...catch 完成後,但在呼叫程式碼取得控制之前。

function f() {
  try {
    alert('start');
    return "result";
  } catch (err) {
    /// ...
  } finally {
    alert('cleanup!');
  }
}

f(); // cleanup!

…或當有 throw,如下所示

function f() {
  try {
    alert('start');
    throw new Error("an error");
  } catch (err) {
    // ...
    if("can't handle the error") {
      throw err;
    }

  } finally {
    alert('cleanup!')
  }
}

f(); // cleanup!

finally 會保證此處的清理。如果我們只將程式碼放在 f 的尾端,它不會在這些情況下執行。