今回は「例外処理」についてご紹介させていただきます。
「例外処理」とは何だか変な言葉ですが、何かしらのコードを実行した時に、もしかしたらエラーが起こる可能性がある場合に、エラーに対してどのような対処をするべきか事前にプログラムを書いておくことです。
これにより、エラーが発生した場合に、プログラムを停止させることなく処理を実行させることが可能になります。
try…catch 構文
let plus = function(a,b){ return a + b ; } console.log(plus(3,3)); 6
まずは引数を合計する簡単な関数で見ていきましょう。
「aとb」に3を指定すれば、「6」が返されます。
let plus = function(a,b){ return a + b ; } console.log(plus(3,3)); console.log(plus(3,-3)); console.log('end'); 6 0 end
連続してコンソールに出力させる時、正しい値が指定されていれば問題なく結果が返されます。
let plus = function(a,b){ return a + b ; } console.log(plus(3,3)); console.log(plus(3,3n)); console.log('end'); 6 Uncaught ReferenceError: a is not defined
しかし正しい値が指定されていない時は、その時点でエラーが表示され処理が終了してしまいます。
最後の「end」を表示する処理は行われることはありません。
このように、何かしらのエラーが発生した時に、エラーを回避して最後まで処理を実行させる時に使用するのが、「try…catch 構文」になります。
それでは、この例を「try…catch 構文」を使って書き換えてみましょう。
try { 例外が発生する可能性のある文
} catch { 例外時の実行する処理
}
let plus = function(a,b){ try{ return a + b ; }catch(e){ console.error(e); } } console.log(plus(3,3)); console.log(plus(3,3n)); console.log('end'); 6 TypeError: Cannot mix BigInt and other types, use explicit conversions end
「try」の後に例外が発生する可能性のある文を記述します。
「catch(e)」の後の「()」に記述してある「e」は任意の変数名です。
この変数には例外処理の情報が格納されているので、「.message」を付与するとエラーの内容を確認することが出来ます。
エラーが発生しても最後に「end」がきちんと返されています。
try…catch…finally 構文
test(); console.log('実行されない'); Uncaught ReferenceError: test is not defined
少し違う角度から見ていきましょう。
まずtest関数という、何も定義されていない関数の後で、コンソールに「実行されない」と表示させようとすると、当然エラーが表示されます。
では、これを先程の「try…catch構文」で記述するとどうなるでしょうか。
try{ test(); }catch(e){ console.log('実行される',e); } 実行される ReferenceError: test is not defined
当然test関数はエラーですが、エラーを回避して「console.log」は実行されています。
try{ test(); }catch(e){ console.log('実行される',e); }finally{ console.log('常に実行されます'); } 実行される ReferenceError: test is not defined 常に実行されます
そしてさらに「finally」を追加すると、ここで書いた式はエラーの有無に関わらず、常に実行されるようになります。
let test = function(a,b){ return a + b; }
次にtest関数を定義してみます。
そして先程と同じコードを実行してみます。
try{ test(); }catch(e){ console.error(e); console.log('実行される'); }finally{ console.log('常に実行されます'); } 常に実行されます
test関数が定義されたので、エラーではなくなり、先程表示された「test is not defined」も表示されていません。
つまりここでは「catch文」は実行されずに、「finally文」だけが実行されています。
「finally文」は、エラーの時も、そうでない時もどちらでも実行されることが確認出来ました。
throw 文
「throw文」は例外を投げることが出来るという文ですが、この言葉だけだとどんなものか良く分かりませんので、早速例を見てみましょう。
let testNum = function(num){ try{ if(num < 10){ throw '残念でした'} console.log('おめでとうございます'); }catch(e){ console.error(e); } } console.log(testNum(5)); console.log(testNum(15)); 残念でした おめでとうございます
try文の中で、例外が発生した場合、catch文の(e)にthrow文が格納されます。
実行結果を見ていただくと分かるのですが、numが10より小さい場合は、throw文が実行されています。
エラーオブジェクト
種類 | 意味 |
---|---|
EvalError | グローバル関数 eval() に関して発生するエラー |
InternalError | JavaScript エンジンで内部エラーが 発生した時に発生するエラー |
RangeError | 数値変数または引数が、 その有効範囲外である場合に発生するエラー |
ReferenceError | 不正な参照から参照先の値を取得した時に発生するエラー |
SyntaxError | 構文エラー |
TypeError | 変数または引数の型が有効でない場合に発生するエラー |
URIError | encodeURI() または decodeURI() に 不正な引数が渡された時に発生するエラー |
出典:MDN Error
あとがき
簡単なようで分かりにくいのが「例外処理」です。
実際に使用する機会は少ないかもしれませんが、基本的な使い方は理解しておくようにしましょう。
今回も最後までお読み頂きありがとうございました。