スポンサーリンク

JavaScriptのtry…catch処理と例外処理

例外処理 JavaScript
例外処理

はい、ぺんしるです。

今日は以下の質問に答えていきたいと思います。

エンジニア
エンジニア

予期しない処理をハンドリングする方法はある?


JavaScriptでは例外処理をハンドリングする方法として、try…catch文をサポートしています。

本日はtry…catch文について記載していきますね。

try… catchとは

try…catch文は、プログラムで通常の処理を継続できなくなった場合のために、記載する処理のことで例外処理とも言われています。

具体的には、以下のように記載します。まずは、try…catch処理がない場合です。

function calc(c){
   var a = 100;
   var b = a / c; //ゼロ割
}

この場合、万が一変数cに0(ゼロ)がはいった場合、ゼロ割が発生することになります。

ゼロ割は、数学の世界でタブーとされている計算で、通常システム開発では0(ゼロ)割りが発生する場合には、どのような仕様にするかを決めておきます。

try…catch処理を入れていない場合は、その時点でプログラムが終了することになります。

このコードに、try…catchで例外処理を追加すると、以下のようになります。

function calc(c){
   try{
       var a = 100;
       var b = a / 0; //ゼロ割
   } catch(e){
       console.log('例外発生');
   }
}

これにより、ゼロ割りが発生するとcatch処理にはいり、catch句の処理(console.log())がはしることになります。catch(e)と記載しましたが、eは変数名なので何でもよいです。

finallyとは

finallyは、事後処理をおこなう句です。
例外の発生有無に関わらず、ファイルを閉じる処理や処理の成功可否のメッセージを記述する場合によく使用します。

finallyは特に不要であれば記載する必要はありません。

try…catch文と組み合わせてfinallyを使用する場合は、次のように記述します。

function calc(c){
   try{
       var a = 100;
       var b = a / 0; //ゼロ割
   } catch(e){
       console.log('例外発生');
   } finally{
    console.log('メソッドの終了');
   }
}

実行結果は、以下になります。

最初にcatch内の処理が実行されて、その後にfinally内の処理が実行されたことが分かるかと思います。

//実行結果
> 例外発生
> メソッドの終了

throwとは

throwを使用して、ユーザー定義による例外をスローします。

スローされた例外は、(変数名がeの場合は)e.nameで例外の名前(この場合’Error’)、e.messageで例外メッセージ(この場合’zero_division’)を参照することができます。

function calc(c){
   try{
    if (c === 0){
          throw new Error('zero_division');
        }
       var a = 100;
       var b = a / 0; //ゼロ割
   } catch(e){
       if (e.name === 'Error') {
         console.log('zero_division');
       } else {
         console.log('ERROR以外のエラー');
       }
   }
}

変数eには以下のような値がはいります。

変数e

実行結果は、以下のようになります。throwでスローされた例外情報が出力されていることが分かるかと思います。

//ゼロ割発生時の実行結果
> ERROR.Error: zerodivision

throwとcatchを組み合わせ

throwとcatchを組み合わせることも可能です。

例えば、入力値をチェックして、結果をスローするような場合には、以下のように記載します。

function calc(c){
   try{
    if (c === 0){
          throw new Error('zero_division');
       } else if (c === 1000){
          throw new Error('max_num');
       }
       var a = 100;
       var b = a / 0; //ゼロ割
   } catch(e){
       if (e.message === 'zero_division') {
         console.log('zero_division');
       else if (e.message === 'max_num') {
         console.log('max_num');
       } else {
         console.log('ERROR以外のエラー');
       }
   }
}

注意

try … catch処理は、処理コストが高い処理になります。ですので、なんでもかんでも、try…catch処理にいれるのは止めましょう。特にループ内にはtry…catchはいれずに、ループの外に記載しましょう。

// NGパターン
function calc(){
  while(i < 10){
     try{
        var a = 100;
        var b = a / 0; //ゼロ割
     } catch(e){
    console.log(e);
     }
  }
}
// OKパターン
function calc(){
 try{ //ループの外にtry...catchをいれる
      while(i < 10){
        var a = 100;
        var b = a / 0; //ゼロ割
     }
  } catch(e){
   console.log(e);
  }
}

最後に

いかがでしたか?

不明点があれば、遠慮なくこちらまたはこちら(匿名での質問ができます)からご質問くださいね。


ではでは(´Д`)

コメント

タイトルとURLをコピーしました