10

パーサーを含む小さな Node.js パッケージを開発しています。回復不可能な問題を検出するとすぐにスローします。

私は Java を何年も使用しており、大量の例外クラスに慣れています。

しかし、これは JavaScript です。スタイルの問題だと思います。私の本質的な問題は、ブロックをキャッチするためにエラーの理由を渡す方法です。私は、さまざまなエラーの理由ごとに異なるエラー「クラス」を作成し、それぞれが各問題の詳細を処理するか、理由をプロパティとして保持する単一のエラー クラスを作成することを考えました。

両方の種類のエラーを処理する例を挙げましょう。

catch(e) {
  if(e instanceof FirstError) {
    ...
  }
  if(e instanceof SecondError) {
    ...
  }
}

catch(err) {
  if(err instanceof AnError) {
    if(err.detail === 'becauseOfA') {
      ...
    }
    if(err.detail === 'becauseOfB') {
      ...
    }
  }
  ...
}

どちらのアプローチが優れていますか? どちらもうまくいきますが、最初のものは好きではありません。多くのクラスは、私には大きなオーバーヘッドのように思えます。

編集:
コールバックの使用に同意します(ここでも回答されています):

// One class per error type
function(err, ast) {
  if(err) {
    if(err instanceof FirstError) {
      ...
    }
    if(err instanceof SecondError) {
      ...
    }
  }
  ...
}

// One class for all errors
function(err, ast) {
  if(err) {
    if(err instanceof AnError) {
      if(err.detail === 'becauseOfA') {
        ...
      }
      if(err.detail === 'becauseOfB') {
        ...
      }
    }
    ...
  }
}

// No class at all
function(err, ast) {
  if(err) {
    if(err.detail === 'becauseOfA') {
      ...
    }
    if(err.detail === 'becauseOfB') {
      ...
    }
    ...
  }
}

問題は解決しません。すべてのクラスを削除して、プロトタイプの継承を持たない単純なオブジェクトを使用する必要がありますか? 問題に関する情報をエラー ハンドラ (キャッチまたはコールバック) に渡す必要があります。

この関数は小さくて高速であるため、同期を維持したいと考えています (はい、コールバックによって関数が非同期にならないことはわかっています)。私の知る限り、Node.js自体は同期コード(fs.readFileSync)でエラーをスローし、エラーオブジェクトを非同期関数(fs.readFile)のコールバックに渡します。

4

1 に答える 1

1

ノードの最善のアプローチは、モジュールをコールバック スタイルで書き直すことだと思います。コールバックには 2 つの引数を渡す必要がありますが、1 つ目はエラーまたは null (操作が正常に完了した場合)、2 つ目は操作の結果 (エラーが発生した場合は null または未定義) です。

コールバックでそれらを簡単に処理できます。エラーを文字列として渡してから、さまざまな状況を処理するために case(error) だけを渡すことができます。

更新:

同期メソッドにはスローを使用できますが、文字列だけをスローしてから切り替えることもできます。エラーを類型化したい場合 (たとえば、メソッドが非常に異なるエラーをスローする可能性がある場合 (Java コードでは、異なるクラスで記述される可能性がある))、次のようにオブジェクトを使用できます: { error: 'error_name', type: 'error_type '}。

そして、switch(err.type)、switch(err.error)。

Javascript でこれにクラスを使用することは、コンストラクター オブジェクトを指すプロトタイプ プロパティを持つオブジェクトを作成し、instaceof がそのポインターを比較するため、最善の方法ではありません。

于 2013-06-15T04:33:29.360 に答える