JavaScript におけるエラーと例外の違い

Susan Sarandon
リリース: 2024-11-23 11:51:17
オリジナル
980 人が閲覧しました

The difference between Error and Exception in 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 つを区別するのでしょうか?

例外が必要な理由はすでに説明しましたが、なぜエラーと例外を区別する必要があるのでしょうか?

ベストプラクティスは、この 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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート