ホームページ > 記事 > ウェブフロントエンド > JavaScript におけるエラーと例外の違い
https://github.com/Ray-D-Song
エラーと例外は、「プログラム可能なエラー」を処理することを目的とした実践から生まれた概念です。
コードの観点から見ると、エラーは手動で正確に処理される傾向があります。
たとえば、fnA は fnB と fnC を呼び出します。どちらのメソッドでもエラーが発生する可能性があり、処理コードはおおよそ次のとおりです:
function fnA() { const { err: bErr, res: bRes } = fnB() if (bErr) { // ... // error handling } const { err: cErr, res: cRes } = fnC() if (cErr) { // ... // error handling } // normal logic }
「エラー」の鍵は、「エラーが発生した」ことを表す 1 つのフィールドを含むオブジェクトまたは配列を関数から返すことです。このフィールドが空でない限り、プログラマは通常のフローが中断されたことを認識します。
JavaScript には内部 Error オブジェクトとコンストラクターがありますが、エラーを表すフィールドが Error オブジェクトである必要はありません。代わりに、Error オブジェクトは例外処理でよく使用されます。
すでにエラー処理があるのに、なぜ例外が必要なのでしょうか?
ボタンがあるシナリオを想像してください。ボタンをクリックすると、関数 A がトリガーされます。複数の層の呼び出し (おそらく 10 層) を経た後、関数 X でエラーが発生します。ユーザーに「不明なエラー」を伝えるのではなく、ユーザーに通知する必要があります。何が問題だったのかについての具体的な情報。
エラーを使用してもこの効果を実現できますが、次のコードを 10 回記述する必要があります。
function fnA() { const { err, res } = fnB() if (err) { // display error to user showErr(err) } } function fnB() { const { err, res } = fnC() if (err) // propagate error return { err, null } } // ... 10 similar passes function fnY() { const { err, res } = fnX() if (err) // propagate error return { err, null } }
この種の定型コードは非常に非効率的です。より良い方法は、例外を使用することです。
fnY でエラーが発生した場合にのみ例外をスローする必要があります。トップレベルでは捕まえることができます。
function fnA() { try { fnB() } catch (e) { showErr(e) } } // ... function fnY() { const { err, res } = fnX() if (err) // 抛出 throw err }
この方法では、どこでエラーが発生しても、それを最上位で捕捉でき、他の層のコードは影響を受けません。
1 か所のエラーでコード構造全体が汚染されることを避けてください。
例外が必要な理由はすでに説明しましたが、なぜエラーと例外を区別する必要があるのでしょうか?
ベストプラクティスは、この 2 つを厳密に区別することです。エラーを層ごとに渡す必要がない場合は、現在の層で直接処理する必要があります。たとえば、fnC のエラーは fnA で使用する必要がないため、B で直接エラーとして処理する必要があります。
すべてのエラーがトップレベルで処理されると仮定すると、すべてのロジックがトップレベルの catch ブロックに積み上げられ、保守が困難になります。
function main() { try { task1() task2() task3() } catch(e) { switch(e) { case "type A": //... break; case "type B": //... break; case "type C": //... break; } } }
以上がJavaScript におけるエラーと例外の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。