エラーの適切な使用


155

かなり大規模なプロジェクトでTypeScriptを使用していますが、Errorsを使用するための標準は何なのかと思っています。たとえば、Javaで範囲外のインデックスを渡すとしましょう。

throw new IndexOutOfBoundsException();

TypeScriptの同等のステートメントは次のようになります。

throw new Error("Index Out of Bounds");

他にどのような方法でこれを達成できますか?受け入れられている基準は何ですか?

回答:


167

誰かがコメントでこのリンクをMDNに投稿しました、そしてそれは非常に役に立ちました。ErrorTypesのようなものを非常に徹底的に説明しています。

EvalError ---グローバル関数eval()に関して発生するエラーを表すインスタンスを作成します。

InternalError --- JavaScriptエンジンの内部エラーがスローされたときに発生するエラーを表すインスタンスを作成します。たとえば、「再帰が多すぎます」。

RangeError ---数値変数またはパラメーターが有効範囲外の場合に発生するエラーを表すインスタンスを作成します。

ReferenceError ---無効な参照を逆参照するときに発生するエラーを表すインスタンスを作成します。

SyntaxError --- eval()でコードを解析中に発生する構文エラーを表すインスタンスを作成します。

TypeError ---変数またはパラメーターが有効なタイプでない場合に発生するエラーを表すインスタンスを作成します。

URIError --- encodeURI()またはdecodeURI()に無効なパラメーターが渡されたときに発生するエラーを表すインスタンスを作成します。


無効な引数のより一般的な型が欠落しているようです。すべての無効な引数がに該当するわけではありませんRangeError。カスタムタイプを定義する必要がありますか、それとも単に定義しますthrow new Error("<message>");か?
anddero

58

JavaScriptの範囲外の規則はを使用していRangeErrorます。タイプを確認するには、if / else + instanceof最も固有のものから最も一般的なものまでを使用します

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
一般的なエラーはどうですか?および/または組み込みのJSエラークラスのリストはどこですか?
ピトサラス2015

7
Mozillaの開発者向けネットワークでJavaScriptエラーの種類やその他の情報のリストがあります:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
クリスチャンDavén

6
@basarat else { throw; }ここに追加する必要があると思います
knocte

43

例外によってメッセージを発行および表示するシンプルなソリューション。

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

注意

ブロックからどのようなエラーが発生するかわからない場合、上記は解決策ではありません。このような場合は、タイプガードを使用し、適切なエラーに対する適切な処理を行う必要があります。@ Moriartyの回答をご覧ください。


明示的な型変換へのポインタをありがとう。Typescript-Docsでその情報を見つけておらず、今日何かを学びました。
JackLeEmmerdeur 2018

<Error>を追加する目的は何ですか?e。メッセージは私にとってはうまくいきます。
sbattou

1
@sbattouの唯一の目的は、(1)インテリセンスと(2)より優れた型チェックができるように、ここに型があることを<Error>TSコンパイラに伝えることです。ただし、キャストはJSにまったく変換されず、純粋に構文上の砂糖であることに注意してください。e<Error>
19

24

switchステートメントを忘れないでください。

  • での取り扱いを確認してくださいdefault
  • instanceof スーパークラスで一致できます。
  • ES6 constructorは正確なクラスで一致します。
  • 読みやすい。

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();


3
これは素晴らしい; 他の回答よりも堅牢でクリーンに見えます。
Victor Zamanian
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.