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

例外に対する処理を記述するときに try...catch...finally 文を使うと、 finally ブロックに例外をキャッチした場合もそうでない場合も必ず実行する処理を記述することができます。ここでは try...catch...finally 文を使った例外処理の記述方法について解説します。

(Last modified: )

try...catch...finally文の使い方

try...catch...finally 文を使用すると、 try ブロックの中で例外がスローされたかどうかに関わらず、必ず最後に実行する処理を記述することができます。書式は次のとおりです。

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

finally のあとのブロックは、 try ブロックの処理が終わったあと、また例外がスローされた場合は catch ブロックの処理が終わったあとで必ず実行されます。 try ブロックや catch ブロックの中で retnrn 文や break 文などが実行されて処理が try...catch...finally 文から別のところへ移動する場合であっても、移動が行われる前に実行されます。

ファイルに対する処理やデータベースに対する処理をなどを try ブロック内で行っているときに、例外がスローされるかどうかに関わらず最後にファイルへの接続を閉じたりデータベースからの切断処理などを行いたい場合に利用されることが多いようです。

ここでは動作の確認を行うために簡単なサンプルをみてください。

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

  return sum;
}

console.log('Start');

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

console.log('End');

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

例外がスローされる可能性のある文を try ブロック内に記述し、例外をキャッチした場合の処理を catch ブロック内に記述しています。そして例外をキャッチするかどうかに関わらず最後に実行する処理を finally ブロック内に記述しています。

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

なお catch がない try...finally 文も書式としては問題ありません。

try{
  例外が発生する可能性がある文を記述
  ・・・
} finally {
  最後に実行される処理
  ・・・
}

ただ catch がない場合は例外をキャッチすることができませんので、 例外がスローされた場合はプログラムが強制終了します。

-- --

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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