例外のハンドリング
JavaScriptには、例外のために使用できるError
クラスがあります。あなたはthrow
キーワードでエラーを投げます。あなたはtry
/catch
ブロックの対でそれを捕まえることができます。
エラーサブタイプ
ビルトインされたError
クラスのほかに、JavaScriptランタイムが投げることができるError
を継承するいくつかの組み込みエラークラスがあります:
RangeError
数値変数またはパラメータが有効な範囲外にあるときに発生するエラーを表すインスタンスを作成します。
ReferenceError
参照されたのが無効な参照だった場合に発生するエラーを表すインスタンスを作成します。例えば
SyntaxError
有効でないJavaScriptを解析する際に発生する構文エラーを表すインスタンスを作成します。
TypeError
変数またはパラメータが有効な型でないときに発生するエラーを表すインスタンスを作成します。
URIError
encodeURI()
または decodeURI()
に無効なパラメータが渡されたときに発生するエラーを表すインスタンスを生成します。
常にエラーを使用する
初心者のJavaScriptデベロッパーは、たまに生の文字列のみをエラーとして投げます。
これはしないでください。Error
オブジェクトの基本的な利点は、stack
プロパティを使ってビルドされた場所を自動的に追跡することです。
生の文字列は非常に苦しいデバッグ経験をもたらし、ログからのエラー分析を複雑にします。
あなたはエラーをスローする必要はありません
Error
オブジェクトを渡すことは大丈夫です。これは、Node.jsのコールバックスタイルコードでは、最初の引数をエラーオブジェクトとしてコールバックを受け取ります。
例外的なケース
「例外は例外的でなければならない」は、コンピュータサイエンスの一般的な言葉です。これがJavaScript(およびTypeScript)にも当てはまる理由はいくつかあります。
どこに投げられるのか不明
次のコードを考えてみましょう。
次の開発者は、どの関数がエラーを投げるかわかりません。コードをレビューしている人は、task1/task2のコードとそれが呼び出す可能性のある他の関数を読み取ることなく知ることができません。
優雅なハンドリングを困難にする
スローする可能性のあるものの周りを明示的にキャッチして優雅にしようとすることができます:
しかし、最初のタスクから2番目のタスクに物事を渡す必要がある場合、コードは乱雑になります。(foo
のミューテションにlet
が必要になる + 明示的に型をアノテートしなければならなくなることに注意してください。これは、runTask1
の戻り値から型を推測できないためです) :
型システムでうまく表現されていない
次の関数を考えてみましょう。
このような場合にError
を使うのは、validate関数の型定義((value:number) => void
)で表現されていないので、悪い考えです。代わりに、検証メソッドを作成するためのより良い方法は次のとおりです。
そして今、型システムで表現されています。
非常に一般的な(シンプル/キャッチオールなど)の方法でエラーを処理しない限り、エラーをスローしないでください。
最終更新