パーサーを含む小さな 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)のコールバックに渡します。