はい、ぺんしるです。
今日は以下の質問に答えていきたいと思います。

予期しない処理をハンドリングする方法はある?
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には以下のような値がはいります。

実行結果は、以下のようになります。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);
}
}
最後に
いかがでしたか?
不明点があれば、遠慮なくこちらまたはこちら(匿名での質問ができます)からご質問くださいね。
ではでは(´Д`)
コメント