try...catch文を使った例外処理

プログラムの中でエラーが発生し例外がスローされた場合、例外に対する処理を設定していない場合はプログラムがその時点で強制終了してしまいます。例外がスローされた時に強制終了させずに例外に対する処理を行うには try...catch 文を使用します。ここでは try...catch 文を使った例外処理の記述方法について解説します。

(Last modified: )

例外がスローされた時の挙動について

最初に例外に対して何の処理も記述していないプログラムで例外がスローされた時の挙動を確認しておきます。次のサンプルをみてください。

function sum(a, b){
  let sum = a + b;
  return sum;
}

console.log('Start');

let result = sum(10, 8);
console.log(result);

console.log('End');

>> Start
>> 18
>> End

2 つの引数を取ってその合計を返す簡単な関数を使ったサンプルです。関数を呼びだす時に、どちらも数値を指定した場合は特にエラーは発生しません。

それではサンプルを少し変更して、関数を呼びだすときの引数のひとつを長整数の値に変更してみます。

function sum(a, b){
  let sum = a + b;
  return sum;
}

console.log('Start');

let result = sum(10, 8n);
console.log(result);

console.log('End');

>> Start
>> TypeError: Cannot mix BigInt and other types, use explicit conversions

今回はプログラムの途中で TypeError が発生しました。数値と長整数の値は演算できないためです。プログラムの途中でエラ―が発生すると例外がスローされます。スローされた例外をキャッチして適切な処理を行うように記述されていない場合、今回のサンプルのようにプログラムが途中で強制終了となります。

例外をキャッチして適切な処理を行うために使用されるのが try...catch 文です。このあとで、使い方について解説します。

try...catch文の使い方

try...catch 文を使用するとスローされた例外をキャッチし、行うべき処理について記述することができます。書式は次のとおりです。

try{
  例外が発生する可能性がある文を記述
  ・・・
} catch(e) {
  例外をキャッチしたときに実行される処理
  ・・・
}

try のあとのブロック内に例外が発生する可能性のある文を記述してください。このブロック内で行われた処理でスローされた例外だけをキャッチします。エラーが発生し例外がスローされたら、 catch のあとのブロック内の処理を順に実行します。

catch のあとの括弧の中に記述した変数 e (変数名は任意です)には、例外がスローされたときに設定された値が格納されます。通常は Error オブジェクトですが、自分で例外をスローする場合には任意の値を指定できるので Error オブジェクトとは限りません。

それでは先ほどのサンプルを一部変更し、 try...catch 文を使って例外処理を加えてみます。

function sum(a, b){
  let sum;
  try{
    sum = a + b;
  } catch(e) {
    console.error(e);
    return null;
  }

  return sum;
}

console.log('Start');

console.log(sum(10, 8));
console.log(sum(10, 8n));

console.log('End');

>> Start
>> 18
>> TypeError: Cannot mix BigInt and other types, use explicit conversions
>> null
>> End

関数内の変数を加算する文を try のブロック内に記述します。これでこの文で例外がスローされた場合に例外をキャッチすることができます。そして catch のブロック内で例外をキャッチした場合に実行される処理を記述しています。今回はコンソールに対して Error オブジェクトの内容を出力したあと、関数の呼び出し元に対して null を返しています。

今回のサンプルでは最初に関数を呼びだした時はエラーが発生していないため tyr...catch 文が何もないように処理が行われています。そして二回目に関数を呼びだした時は、エラーが発生し例外もスローされているのですが、 try...catch 文で例外が発生した場合の対処方法を記述しているため、プログラムが途中で強制終了することなく最後まで実行されています。

-- --

try...catch 文を使った例外処理の記述方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。