JavaScript入門 例外処理

最終更新日

プログラムの実行には、エラーがつきものです。プログラムにおけるエラーは例外(Exception)とも呼び、例外が発生したときに実行する処理は例外処理と呼びます。例外処理は、ある程度本格的なプログラム(システムがいきなり停止すると困る場合など)に使う記法です。

try/catch/finally構文

JavaScript エンジンが発生させた例外について、コードの実行を継続するには「try/catch/finally」構文を使って例外時の処理を書きます。

try{

    nonExistingFunction():
    console.log("nonExistingFunctionでの例外により、これ以上実行されません。");

} catch ( error ){

    console.log("nonExistingFunctionは存在しません。");
    console.log( "エラータイプ:" + error.name);
    console.log( "エラーメッセージ:" + error.message);

} finally {
    console.log("後処理の記述が必要な場合はここに記述します。");
}
console.log("例外が発生しても後続のコードは実行されます。");

このとき、catch( error )の部分の例外識別子errorにエラーの内容が渡されます。上記のコードでは、参照できない関数nonExistingFunctionを実行しているため、JavaScript エンジン内部でReferenceErrorが発生し、それが自動的にerrorに設定される。

tryブロック

例外が発生する可能性がある処理をtryブロックに記述します。tryブロック内で例外が発生した場合には、その時点でcatchブロックに処理が移ります。つまり、tryブロック内の例外が発生した行以降コードは実行されません。

catchブロック

catchブロックには、例外発生した時の処理を記述します。また、例外識別子には、例外が発生した原因がオブジェクトになって渡されます。

finallyブロック

finallyブロックには、例外の発生有無にかかわらず実行したいコードを記述します。つまり、「tryブロックの終了後」または「catchブロックの終了後」に、finallyブロック内のコードを必ず実行します。

明示的な例外のスロー

意図的に例外を発生させたい場合は、throwというキーワードを使います。throwに続く例外識別子がそのままcatch( 例外識別子 )に渡されます。また、throwをtryブロックの外で使用した場合には、throwが呼び出された時点で処理が終了します。

構文

try{
   throw 例外識別子;
} catch( 例外識別子 ){
   例外発生時の処理
}

明示的な例外スロー

変数numが数値でない場合に、throwによって例外が投げられます。catchブロックに処理が移ります。なお、変数numに数値が格納されている場合は、※1が実行されます。

try{
    const num = "3";
    if ( typeof num !== "number" ){
         throw "numは数値型でなければなりません。";
    }
    console.log( `${ num } x 5 = ${ num * 5 }`);  //※1
} catch ( error ){
    console.error( error );
}

Errorオブジェクトを例外識別子として設定した場合

try{
    throw new Error( "numは数値型でなければなりません。" )
} catch(  error ){
    console.error( error );
}
>numは数値型でなければなりません。

throwに続く例外識別子に、new演算子とErrorオブジェクトを記述しています。は、例外発生時の情報を保持するためのオブジェクトです。

エラーの種類によって例外処理に条件分岐を持たせる

try{
    //数値に対して文字列のメソッドであるtoUpperCaseを呼んだ場合
    const num = 1;
    num.toUpperCase();

    //存在しない変数val2を参照した場合
    let val1 = val2 + 1;
} catch(  error ){
    //例外の種類に応じて処理を分岐する
    if( error instanceof TypeError ){
        console.log( "TypeErrorが発生したときの処理" );
    } else if( error instanceof ReferenceError ){
        console.log( "ReferenceErrorが発生したときの処理" );
    }
}
>numは数値型でなければなりません。

代表的な例外の種類

JavaScript エンジンが発生させる例外の中で、よく遭遇する例外の種類(オブジェクト)について記載します。

ReferenceError

未定義の変数や関数を参照しようとした場合に発生します。

SyntaxError

記法に間違いがある場合に発生します。

TypeError

主に、メソッド実行時に期待された型ではなかった場合に発生します。