備忘録的プログラミングリファレンス

例外処理 try ~ catch

 例外処理とは、適切なエラー処理を行うのための方法です。try ~ catch 文によって実装します。

 ディスク容量不足やネットワークの不具合といった内部でエラーが起こって処理がフリーズするとユーザーとしても何が起こったのか分かりません。
 そのようなエラーが発生しても処理を止めずにそのエラーを捉えた処理に移行します。

  try 文には例外が発生する可能性があるコードを入れます。try 文のコードでエラーが発生すると catch 文の中のコードに移行します。

例外処理
try{
	// 例外処理の対象コード。エラーが発生する可能性があるコード
} catch( e ) {
	// 例外処理。エラーが発生した場合の処理
}

 e はエラーオブジェクトです。開発用コンソールで内容を確かめることができます。

 try ~ catch による例外処理以降も処理が続きます。継続する処理は以下のように try ~ catch 文以降に編集します。

 以下の例では、try ~ catch による例外処理以降に console.log( '' ); が実行されます。

例外処理
try{
	// 例外処理の対象コード。エラーが発生する可能性があるコード
} catch( e ) {
	// 例外処理。エラーが発生した場合の処理
}

// try ~ catch 以降に実行される
console.log( '' );

 XMLHttpRequest ではイベントを捉えてステータス番号で場合分けする方法を使用します。try ~ catch と XMLHttpRequest の併用は上手く機能しないようです。

 例外処理はフォーム入力などのエラー処理にも使いたくなりますが、そのような場合は通常のフロー処理の方が適しています。
 例外処理は多用すると処理速度が遅くなり、正しく処理されないこともあります。ディスク容量不足やネットワークの不具合といった内部での予測不可能なエラーに使用した方がよいようです。

ページ内 Index

Error オブジェクト

 try ~ catch 文に利用する Error オブジェクトがあります。
 このオブジェクトは任意に生成することもできます。

Error コンストラクター
let error = new Error( 'エラーが発生しました' );

 Error() コンストラクターでエラーメッセージを作成することができます。エラーメッセージは .message プロパティで取得することができます。

エラーメッセージ
console.log( error.message );	// 'エラーが発生しました'と表示される

 throw キーワードと組み合わせると任意にエラーを発生させることができます。

エラーを発生させる

 throw キーワードと Error() コンストラクターでエラーを任意に発生させることができます。

 throw キーワードは、try ~ catch 文の中で使用します。

例外処理
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変数や引数の型が有効でない場合
URIErrorencodeURI() または decodeURI() に不正な引数が渡された場合

stack 値でデバグ

 Error オブジェクトのプロパティの stack 値はエラーが発生したまでの経緯を表示します。

 以下の例では catch 文で取得した e.stack からエラーが発生した経緯を確認しています。

stack 値
try{
	throw new Error('making error');
} catch( e ) {
	console.error( e.stack );
}

 実行経緯をたどることでデバグに役立てることができます。ただし、stack 値が機能するブラウザでなければなりません。

Example

 例外処理 try ~ catch と Error オブジェクトの例です。

 開発コンソールを参照してください。コメントアウトしてあるものは説明にはあるものの利用できるかわからないものの試用のためです。

確認ボタンをクリックしてください。以下のHTML,CSS,Scriptコード例が実行されます。