Javascript

【JavaScript】例外を出す方法

こんにちは、ともです。

JavaScriptを勉強中でして、例外を出す方法について勉強中です。

この記事ではJavaScriptで例外を出す方法について理解をまとめておこうと思います。

例外とは

開発時には「関数の引数に数値を受け取ることを想定していたが文字列が渡される」という風に想定外のエラー(例外)が発生します。

エラーが発生すればスクリプトが停止してしまいアプリが動作しなくなります。

例外処理を利用することにより想定外の利用がなされエラーが発生してもスクリプトが停止しないようにすることができます。

try…catch…finally

let i = 1;
try {
    i = i * j; 
catch (e) {
    console.log(e);//ReferenceError: j is not defined
} finally {
    console.log('処理完了');
}

上記のようなコードを書きました。

変数「j」が宣言されていないにも関わらず「j」が利用されています。

try{}内に書かれたコードでエラーが発生した場合、エラーが発生した箇所以降は実行されずcatch(){}内のスクリプトが実行されます。

このサンプルの場合、catch{}の引数である「e」にはエラー文が格納されます。

次にcatch{}後にfinally{}が実行されます。finally{}内のスクリプトは例外の有無に関わらず必ず実行されます。

throwで例外を投げる

文法的なエラーではなく特定の場合をエラーとして扱いたい場合もあります。

そのような場合はthrowで例外を投げることができます。

let i = 1;
let j = 0;
try {
    if (j === 0) {
        throw '分母が0です。'
    }
    i = i / j;// 実行されない

} catch (e) {
    console.log(e);
} finally {
    console.log('処理完了');
}

分母が「0」で割り算をしてしまう場合には例外を出すようにしました。

throwにより自分の好きなタイミングで例外を出すことができます。

引数のeにはthrowで投げた値(今回の場合”分母が0です。”)が格納されます。

Errorクラスのオブジェクトを投げる

throw + リテラルではなくthrow new Error()という形でErrorクラスのオブジェクトを投げることもよく行われます。

let i = 1;
let j = 0;
try {
    if (j === 0) {
        throw new Error('分母が0です。')
    }
    i = i / j;// 実行されない

} catch (e) {
    console.log(e.message);//分母が0です
    console.log(e.name);//Error

} finally {
    console.log('処理完了');
}

ErrorクラスについてのMDN

Errorクラスのオブジェクトを投げると、eはErrorクラスのオブジェクトとなります。

Errorクラスはmessageとnameのプロパティを持っており

  • message・・・エラー内容について(今回の場合”分母が0です。”)
  • name・・・Errorクラスのオブジェクトのクラス

Errorクラス以外にも

  1. EvalError
  2. RangeError
  3. ReferenceError
  4. SyntaxError
  5. TypeError
  6. URIError

といったエラーに関するクラスが存在し、適当なErrorクラスからErrorを投げるのが良いです。

まとめ

try…catch…finallyにより例外をスローすることができることが分かりました。

  • 例外処理によりエラーが発生しても止まらないスクリプトを作成することが可能
  • throw+各リテラル により例外をスロー可能
  • throw+Errorクラスのオブジェクトにより例外をスロー可能