JavaScriptのtry/catchとは?エラー処理の基本と使い方を徹底解説

JavaScriptのエラー発生と処理の流れをイメージしたtry/catchのビジュアル
JavaScriptのtry/catchによるエラー処理の流れを直感的に表現したアイキャッチ画像

JavaScriptで開発を進めるうえで、エラー処理は避けて通れない重要な要素です。
特に、予期しないエラーが発生した場合でもアプリケーションを安全に動作させるためには、try/catchの理解が欠かせません。

この記事では、JavaScriptのtry/catchについて、基礎から実践まで体系的に解説します。

try/catchとは?

try/catchは、エラーが発生する可能性のある処理を安全に実行するための構文です。

通常、JavaScriptでエラーが発生すると、その時点で処理は停止します。しかし、try/catchを使うことで、エラー発生時の処理を自分で制御できます。

基本構文

try {
  // エラーが発生する可能性のある処理
} catch (error) {
  // エラー発生時の処理
}

try/catchの基本的な使い方

まずは、最もシンプルな例から見ていきます。

try {
  const result = notDefinedVariable + 1;
  console.log(result);
} catch (error) {
  console.log("エラーが発生しました");
}

実行結果

エラーが発生しました

このように、エラーが発生してもプログラムは停止せず、catchブロックが実行されます。

errorオブジェクトの活用

catchの引数には、エラー情報が格納されたオブジェクトが渡されます。

try {
  JSON.parse("invalid json");
} catch (error) {
  console.log(error.message);
}

実行結果(例)

Unexpected token i in JSON at position 0

主なプロパティ

  • message:エラー内容
  • name:エラーの種類
  • stack:エラーの発生箇所(デバッグ用)

finallyの使い方

finallyは、エラーの有無に関係なく必ず実行される処理です。

try {
  console.log("処理開始");
} catch (error) {
  console.log("エラー発生");
} finally {
  console.log("後処理");
}

実行結果

処理開始
後処理

finallyは、以下のような場面で有効です。

  • リソースの解放
  • 後片付け処理
  • ログ出力

throwで独自のエラーを発生させる

throwを使うことで、意図的にエラーを発生させることも可能です。

function checkAge(age) {
  if (age < 18) {
    throw new Error("18歳未満は利用できません");
  }
  return "利用可能です";
}

try {
  console.log(checkAge(15));
} catch (error) {
  console.log(error.message);
}

実行結果

18歳未満は利用できません

try/catchが必要な場面

try/catchは、すべての処理に使うものではありません。主に以下のケースで活用されます。

1. 外部データの処理

try {
  const data = JSON.parse('{"name": "Taro"}');
  console.log(data.name);
} catch (error) {
  console.log("JSONの解析に失敗しました");
}

2. ユーザー入力の検証

function parseNumber(value) {
  const num = Number(value);
  if (isNaN(num)) {
    throw new Error("数値ではありません");
  }
  return num;
}

try {
  console.log(parseNumber("abc"));
} catch (error) {
  console.log(error.message);
}

非同期処理とtry/catch(async/await)

try/catchは、async/awaitと組み合わせることで非同期処理のエラーも扱えます。

async function fetchData() {
  try {
    const response = await fetch("https://jsonplaceholder.typicode.com/posts/1");
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.log("通信エラーが発生しました");
  }
}

fetchData();

非同期処理の基礎については、
JavaScriptの非同期処理とは?Promiseとasync/awaitの基礎」もあわせて確認しておくと理解が深まります。

try/catchの注意点

1. 同期処理のエラーのみ捕捉できる

通常のtry/catchは、同期的に発生するエラーのみを捕捉します。

try {
  setTimeout(() => {
    throw new Error("非同期エラー");
  }, 1000);
} catch (error) {
  console.log("捕まらない");
}

この場合、エラーは捕捉されません。

2. 多用しすぎない

try/catchを多用すると、コードの可読性が下がります。
必要な箇所だけに限定して使用することが重要です。

try/catchと条件分岐の違い

エラー処理と条件分岐は役割が異なります。

  • 条件分岐(if文):予測できる分岐
  • try/catch:予測できないエラー

条件分岐については、
JavaScriptの条件分岐(if文)とは?基本から解説」で詳しく解説しています。

まとめ

JavaScriptのtry/catchは、エラー処理を安全に行うための基本構文です。

ポイントを整理すると以下の通りです。

  • エラー発生時の処理を制御できる
  • errorオブジェクトで詳細情報を取得可能
  • finallyで必ず実行される処理を定義できる
  • throwで独自エラーを発生できる
  • 非同期処理ではasync/awaitと組み合わせる

適切に使うことで、安定したアプリケーション開発につながります。

関連記事