デバッグにおける最大の課題は何ですか?その 1 つは間違いなくエラーの原因を追跡することです。
次のシナリオを想像してください:
const func = () => { doSth('A'); doSth('B'); };
func がエラーをスローした場合、どのステップでエラーが発生したかをどのように特定しますか? doSth('A')、doSth('B')、または func 自体が原因でしたか?明らかに、エラーには十分なコンテキストが不足しています。
この問題に対処する一般的なアプローチは次のようになります:
const func = () => { try { doSth('A'); } catch (error) { throw new Error('An error from A', error); } try { doSth('B'); } catch (error) { throw new Error('An error from B', error); } };
このアプローチを使用すると、エラーの原因をより簡単に特定できます。ただし、このソリューションにはいくつかの制限があります。
損失エラーの詳細:
エラーに広範な情報 (ペイロード、HTTP ステータス コード、エラー コードなど) が含まれている場合、このアプローチでは、新しく構築されたエラーに doSth のエラー メッセージが追加されるだけです。元のスタック トレースを含むその他の重要な詳細は失われます。
ログの可読性の低下:
潜在的なエラー ポイントが 2 つ以上あると、ログが乱雑になり、解釈が難しくなる可能性があります。
意図表現のあいまいさ:
このコードでは、新しいエラーがキャッチされた特定の doSth 関数によって引き起こされることを明示的に伝えていないため、コードの可読性を向上させる余地が残されています。
これらの問題に対処するために、ECMAScript 2022 では error.cause が導入されました。
この機能を使用すると、開発者は新しいエラー オブジェクトを作成するときにエラーの根本原因を指定できます。 error.cause を使用すると、エラーの連鎖を確立でき、問題の根本原因のデバッグと追跡が容易になります。
これは簡単な例です:
try { // Some operation that may throw an error } catch (error) { throw new Error('Something went wrong', { cause: error }); }
このアプローチを使用すると、エラー間の因果関係を構築できます。例:
const func = () => { try { doSth('A'); } catch (error) { throw new Error('An error from A', { cause: error }); } try { doSth('B'); } catch (error) { throw new Error('An error from B', { cause: error }); } };
これにより、下位レベルの関数 (例: doSth('A')) によってスローされたエラーをキャッチし、関連するコンテキストを追加する新しいエラー (例: 「doSth('A') の実行中にエラーが発生しました」) をスローできるようになります。 )、元のエラーの詳細(例:「A は不正な引数です。」)を保持します。
error.cause のもう 1 つの利点は、リンクされたエラーのチェーンを作成でき、開発者がアプリケーションの複数の層を通じて問題を追跡できることです。
const func = () => { try { try { try { doSth('A'); } catch (error) { throw new Error('Error at depth 3', { cause: error }); } } catch (error) { throw new Error('Error at depth 2', { cause: error }); } } catch (error) { throw new Error('Error at depth 1', { cause: error }); } }; console.log(error.cause.cause); // Error at depth 3
Node.js では、原因のあるエラーはコンソールで特別に処理されます。関連するすべてのエラー スタックが出力されます:
const func = () => { doSth('A'); doSth('B'); };
const func = () => { try { doSth('A'); } catch (error) { throw new Error('An error from A', error); } try { doSth('B'); } catch (error) { throw new Error('An error from B', error); } };
このアプローチにより、エラーの追跡可能性が向上するだけでなく、コードの可読性と保守性も向上します。
Leapcell は、Web ホスティング、非同期タスク、Redis 用の次世代サーバーレス プラットフォームです:
多言語サポート
無制限のプロジェクトを無料でデプロイ
比類のないコスト効率
効率化された開発者エクスペリエンス
簡単な拡張性と高いパフォーマンス
ドキュメントでさらに詳しく見てみましょう!
X でフォローしてください: @LeapcellHQ
ブログをお読みください
以上がJavaScript デバッグの隠れた宝石: error.causeの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。