跳至主要内容

錯誤原因

· 閱讀時間約 2 分鐘
Victor Gomes ([@VictorBFG](https://twitter.com/VictorBFG))

假設你有一個函數正在調用兩個分開的工作負載 doSomeWorkdoMoreWork。這兩個函數可以拋出同類型的錯誤,但你需要以不同方式處理它們。

捕捉錯誤並帶有額外上下文信息再次拋出是解決這個問題的一種常見方法,例如:

function doWork() {
try {
doSomeWork();
} catch (err) {
throw new CustomError('某些工作失敗', err);
}
doMoreWork();
}

try {
doWork();
} catch (err) {
// |err| 是來自 |doSomeWork| 還是 |doMoreWork|?
}

可惜上述解決方案比較繁瑣,因為需要創建自己的 CustomError。而更糟的是,沒有任何開發工具能為意外異常提供有用的診斷信息,因為目前還沒有關於如何正確表示這些錯誤的共識。

目前缺少的是一種標準的方式來鏈接錯誤。JavaScript 現在支援錯誤原因。在 Error 構造函數中可以添加一個額外的選項參數,並包含 cause 屬性,其值會分配給錯誤實例,這樣錯誤就可以很方便地鏈接。

function doWork() {
try {
doSomeWork();
} catch (err) {
throw new Error('某些工作失敗', { cause: err });
}
try {
doMoreWork();
} catch (err) {
throw new Error('更多工作失敗', { cause: err });
}
}

try {
doWork();
} catch (err) {
switch(err.message) {
case '某些工作失敗':
handleSomeWorkFailure(err.cause);
break;
case '更多工作失敗':
handleMoreWorkFailure(err.cause);
break;
}
}

此功能已在 V8 v9.3 中提供。

錯誤原因支援