例外 (exception)

例外発生時には現在の関数の処理は停止し、コールスタックにある最初のcatchブロックへ処理が移ります。このときcatchブロックが存在しなければ、プログラムは停止します。throw - JavaScript | MDN

try、catch、finally

try
{
  statements1
}
catch( catchID )
{
  statements2
}
finally
{
  statements3
}

catch

try
{
    foo;
}
catch( catchID )
{
    alert( catchID ); // ReferenceError: foo is not defined
}

catchでは必ず1つの識別子を指定します。上記ではcatchIDがそれで、これを省略すると「SyntaxError: missing identifier in catch」として、新たな例外が発生します。

条件付きcatch節 (Conditional catch clauses)

エラー型に応じて例外を捕捉する方法です。

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

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となる
}

Error

new Error( [message[, fileName[,lineNumber]]] )

プロパティ

標準的なプロパティ
プロパティ 説明
message エラーメッセージ
name エラー名
Mozilla独自
プロパティ 説明
fileName エラーの発生したファイルパス
lineNumber エラーの発生したファイルの行番号
columnNumber エラーの発生したファイルの列番号
stack スタックトレース
Mozilla - Error - JavaScript | MDN

たとえば次のコードを実行すると、

function Bar()
{
  try
  {
    foo; // ここで例外が発生
  }
  catch( e )
  {
    alert( e ); // 下表は、ここでのeのプロパティ
  }
}

Bar();

catch節で捕捉されるErrorオブジェクトのプロパティは、下表のようになります。

プロパティ
message "foo is not defined"
name "ReferenceError"
fileName "http://localhost/test.js"
lineNumber 5
columnNumber 4
stack "Bar@http://localhost/test.js:5
@http://localhost/test.js:13 "

エラー型 (Error types)

オブジェクト エラーが発生する状況
EvalError eval()不適切に使用された場合
SyntaxError eval()内のコードに構文エラーがある場合
RangeError 数値をあらわす変数または引数が、その有効範囲外である場合
ReferenceError 不正な参照を読み出した場合
TypeError 変数または引数の型が有効でない場合
URIError encodeURI()またはdecodeURI()が不正な引数を渡された場合
Error types - Error - JavaScript | MDN
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
}