例外発生時には現在の関数の処理は停止し、コールスタックにある最初のcatchブロックへ処理が移ります。このときcatchブロックが存在しなければ、プログラムは停止します。throw - JavaScript | MDN
try { statements1 } catch( catchID ) { statements2 } finally { statements3 }
try { foo; } catch( catchID ) { alert( catchID ); // ReferenceError: foo is not defined }
catchでは必ず1つの識別子を指定します。上記ではcatchIDがそれで、これを省略すると「SyntaxError: missing identifier in catch」として、新たな例外が発生します。
エラー型に応じて例外を捕捉する方法です。
try { ... } catch( e if e instanceof TypeError ) { // TypeError例外を処理する文 } catch( e ) { // 対象外の例外ならば、再スローする throw e; }Conditional catch clauses - try...catch - JavaScript | MDN
しかしこれは非標準の方法のため、使用すべきではありません。標準の方法で実現するにはErrorオブジェクトのnameプロパティからエラー名を取得して、次にようにします。
try { ... } catch( e ) { switch( e.name ) { case 'TypeError': // TypeError例外を処理する文 break; default: // 対象外の例外ならば、再スローする throw e; } }
throw expression;throw - JavaScript | MDN
expressionには任意の式を指定できます。しかし一般的にはErrorオブジェクトか、それを継承したオブジェクトを指定します。
try { throw 'ABC'; // または // throw new Error( 'ABC' ); } catch( e ) { alert( e ); // 'ABC' }
JavaScriptにはC++のような例外の再スローの構文はなく、catchした例外をそのままthrowすることで実現します。
try
{
...
}
catch( e )
{
throw e;
// throw; SyntaxErrorとなる
}
new Error( [message[, fileName[,lineNumber]]] )
プロパティ | 内容 |
---|---|
message | エラーメッセージ |
name | エラー名 |
プロパティ | 内容 |
---|---|
fileName | エラーの発生したファイルパス |
lineNumber | エラーの発生したファイルの行番号 |
columnNumber | エラーの発生したファイルの列番号 |
stack | スタックトレース |
たとえば次のコードを実行すると、
function Func() { try { foo; // ここで例外が発生 } catch( e ) { alert( e ); // 下表は、ここでのeのプロパティ } } Func();
catch節で捕捉されるErrorオブジェクトのプロパティは、下表のようになります。
プロパティ | 値 |
---|---|
message | "foo is not defined" |
name | "ReferenceError" |
fileName | "http://localhost/sample.js" |
lineNumber | 5 |
columnNumber | 4 |
stack | "Func@http://localhost/sample.js:5 @http://localhost/sample.js:13 " |
オブジェクト | エラーが発生する状況 |
---|---|
EvalError | eval()が不適切に使用された場合 |
SyntaxError | eval()内のコードに構文エラーがある場合 |
RangeError | 数値をあらわす変数または引数が、その有効範囲外である場合 |
ReferenceError | 不正な参照を読み出した場合 |
TypeError | 変数または引数の型が有効ではない場合 |
URIError | encodeURI()またはdecodeURI()が不正な引数を渡された場合 |
try { throw new TypeError( 'foo', 'bar', 123 ); } catch( e ) { alert( e.name ); // "TypeError" alert( e.message ); // "foo" alert( e.fileName ); // "bar" alert( e.lineNumber ); // 123 }