try…catch 結構
一旦發生錯誤,程序就中止執行了。JavaScript 提供了try...catch
結構,允許對錯誤進行處理,選擇是否往下執行。
try { throw new Error('出錯了!'); } catch (e) { console.log(e.name + ": " + e.message); console.log(e.stack); } // Error: 出錯了! // at <anonymous>:3:9 // ...
上面代碼中,try
代碼塊拋出錯誤(上例用的是throw
語句),JavaScript 引擎就立即把代碼的執行,轉到catch
代碼塊,或者說錯誤被catch
代碼塊捕獲了。catch
接受一個參數,表示try
代碼塊拋出的值。
如果你不確定某些代碼是否會報錯,就可以把它們放在try...catch
代碼塊之中,便於進一步對錯誤進行處理。
try { f(); } catch(e) { // 處理錯誤 }
上面代碼中,如果函數f
執行報錯,就會進行catch
代碼塊,接着對錯誤進行處理。
catch
代碼塊捕獲錯誤之后,程序不會中斷,會按照正常流程繼續執行下去。
try { throw "出錯了"; } catch (e) { console.log(111); } console.log(222); // 111 // 222
上面代碼中,try
代碼塊拋出的錯誤,被catch
代碼塊捕獲后,程序會繼續向下執行。
catch
代碼塊之中,還可以再拋出錯誤,甚至使用嵌套的try...catch
結構。
var n = 100; try { throw n; } catch (e) { if (e <= 50) { // ... } else { throw e; } } // Uncaught 100
上面代碼中,catch
代碼之中又拋出了一個錯誤。
為了捕捉不同類型的錯誤,catch
代碼塊之中可以加入判斷語句。
try { foo.bar(); } catch (e) { if (e instanceof EvalError) { console.log(e.name + ": " + e.message); } else if (e instanceof RangeError) { console.log(e.name + ": " + e.message); } // ... }
上面代碼中,catch
捕獲錯誤之后,會判斷錯誤類型(EvalError
還是RangeError
),進行不同的處理。