エラーの原因

公開日 · タグ: ECMAScript

2 つの別のワークロード doSomeWorkdoMoreWork を呼び出す関数があるとします。どちらの関数も同種のエラーをスローすることがありますが、それらの処理方法は異なります。

エラーをキャッチして追加のコンテキスト情報を付加してスローすることは、この問題に対する一般的なアプローチです。例:

function doWork() {
try {
doSomeWork();
} catch (err) {
throw new CustomError('Some work failed', err);
}
doMoreWork();
}

try {
doWork();
} catch (err) {
// Is |err| coming from |doSomeWork| or |doMoreWork|?
}

残念ながら、独自の CustomError を作成する必要があるので、このソリューションは煩雑です。さらに悪いことに、これらのエラーを適切に表現する方法に関するコンセンサスが取れていないため、予期しない例外に対して開発ツールは役立つ診断メッセージを提供することができません。

これまで欠落していたのは、エラーを連鎖する標準的な方法です。JavaScript では、エラーの原因がサポートされました。cause プロパティを持つ追加のオプションパラメーターを Error コンストラクターに追加できます。その値はエラーインスタンスに割り当てられます。その後、エラーを簡単に連鎖させることができます。

function doWork() {
try {
doSomeWork();
} catch (err) {
throw new Error('Some work failed', { cause: err });
}
try {
doMoreWork();
} catch (err) {
throw new Error('More work failed', { cause: err });
}
}

try {
doWork();
} catch (err) {
switch(err.message) {
case 'Some work failed':
handleSomeWorkFailure(err.cause);
break;
case 'More work failed':
handleMoreWorkFailure(err.cause);
break;
}
}

この機能は、V8 v9.3 で利用できます。

エラーの原因のサポート #