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
主に、メソッド実行時に期待された型ではなかった場合に発生します。