例外発生時には現在の関数の処理は停止し、コールスタックにある最初の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
}