例外処理 try ~ catch
例外処理とは、適切なエラー処理を行うのための方法です。
ディスク容量不足やネットワークの不具合といった内部でエラーが起こって処理がフリーズするとユーザーとしても何が起こったのか分かりません。
そのようなエラーが発生しても処理を止めずにそのエラーを捉えた処理に移行します。
try{ // 例外処理の対象コード。エラーが発生する可能性があるコード } catch( e ) { // 例外処理。エラーが発生した場合の処理 }
e はエラーオブジェクトです。開発用コンソールで内容を確かめることができます。
この try ~ catch による例外処理以降も処理を続けます。
try{ // 例外処理の対象コード。エラーが発生する可能性があるコード } catch( e ) { // 例外処理。エラーが発生した場合の処理 } console.log( '' );
XMLHttpRequest ではイベントを捉えてステータス番号で場合分けする方法を使用します。try ~ catch と XMLHttpRequest の併用は上手く機能しないようです。
例外処理はフォーム入力などのエラー処理にも使いたくなりますが、そのような場合は通常のフロー処理の方が適しています。
例外処理は多用すると処理速度が遅くなり、正しく処理されないこともあります。ディスク容量不足やネットワークの不具合といった内部での予測不可能なエラーに使用した方がよいようです。
ページ内 Index
Error オブジェクト
try ~ catch に利用する Error オブジェクトがあります。
このオブジェクトは任意に生成することもできます。
let error = new Error( 'エラーが発生しました' );
Error() コンストラクターでエラーメッセージを作成することができます。エラーメッセージは .message プロパティで取得することができます。
console.log( error.message ); // 'エラーが発生しました'と表示される
throw キーワードと組み合わせると任意にエラーを発生させることができます。
エラーを発生させる
throw キーワードと Error() コンストラクターでエラーを任意に発生させることができます。
try{
throw new Error('making error');
} catch( e ) {
console.error( e );
}
throw された Error インスタンスはそのまま catch() ブロックの処理に移行します。
動きに関してはError クラス Example
を参照してください。
エラーを発生させることを、例外を明示的にスロー(throw)するといったりします。
複数の例外処理
JavaScript でも複数の例外処理を編集することができます。
try { //処理 } catch(e if e instanceof EvalError) { ... } catch(e if e instanceof TypeError) { ... } finally { ... }
finally ブロックはどの条件にも該当しない場合に処理を実行します。
以下のエラーオブジェクトをエラー条件に使用することができます。これらのエラーオブジェクトはシステムで発生します。
エラーインスタンス | 概要 |
---|---|
EvalError | 引数の文字列を数式として実行する eval() に関するエラー |
InternalError | 再帰処理において "too much recursion" (深すぎる再帰) などによって内部エラーが発生した場合 |
RangeError | 変数や引数が有効範囲外であるエラー |
ReferenceError | 不正な参照先から値を取得したら |
SyntaxError | 構文エラー |
TypeError | 変数や引数の型が有効でない場合 |
URIError | encodeURI() または decodeURI() に不正な引数が渡された場合 |
stack 値でデバグ
Error オブジェクトのプロパティの stack 値はエラーが発生したまでの経緯を表示します。
try{
throw new Error('making error');
} catch( e ) {
console.error( e.stack );
}
実行経緯をたどることでデバグに役立てることができます。ただし、stack 値が機能するブラウザでなければなりません。
Example
例外処理 try ~ catch と Error オブジェクトの例です。
開発コンソールを参照してください。コメントアウトしてあるものは説明にはあるものの利用できるかわからないものの試用のためです。