JavaScript | 例外処理(try…catch文)

JavaScript
スポンサーリンク

ここからは、初心者でも「実務っぽい」感覚をつかめるように、
ファイル操作API 呼び出し の2つの実践例を、
図解+ステップ式でかみ砕いて説明します。


目次

  1. ファイル操作での例外処理(Node.js 編)
  2. API 呼び出しでの例外処理(fetch / async-await 編)
  3. 例外の種類とデバッグのコツ
  4. まとめ+練習問題

1. ファイル操作での例外処理(Node.js 編)

背景

ファイルを読み書きする処理では、次のようなエラーがよく発生します:

  • ファイルが存在しない
  • 権限がなくて開けない
  • JSON 形式が壊れている

これらはすべて「例外(エラー)」としてスローされます。
👉 try...catch を使って安全に処理するのが基本です。


例:JSON ファイルを読み込むスクリプト

const fs = require("fs");

function loadConfig(filePath) {
  try {
    const data = fs.readFileSync(filePath, "utf8");
    const config = JSON.parse(data); // JSON文字列 → オブジェクト
    console.log("設定ファイルを読み込みました:", config);
    return config;
  } catch (e) {
    console.error("設定ファイル読み込みエラー:", e.message);
    return null;
  }
}

// 実行例
const config = loadConfig("config.json");
console.log("最終的な結果:", config);
JavaScript

解説(ステップごと)

1️⃣ fs.readFileSync
→ ファイルが存在しないと ENOENT エラーを投げます。
2️⃣ JSON.parse
→ JSON の中身が {name:"abc"} のように不正な書式だと SyntaxError
3️⃣ catch ブロック
→ これらをまとめて受け止め、プログラムが止まらないようにします。


さらに安全にする例:エラーの種類を見分ける

const fs = require("fs");

function loadConfig(filePath) {
  try {
    const data = fs.readFileSync(filePath, "utf8");
    return JSON.parse(data);
  } catch (e) {
    if (e.code === "ENOENT") {
      console.error("ファイルが見つかりません:", filePath);
    } else if (e instanceof SyntaxError) {
      console.error("JSONの形式が間違っています");
    } else {
      console.error("その他のエラー:", e);
    }
    return null;
  }
}
JavaScript

🔍 e.codeinstanceof で原因別に処理するのが、実務では重要です。


2. API 呼び出しでの例外処理(fetch + async/await)

ブラウザやNode.js環境での「外部APIとの通信」は、
通信失敗・ネットワークエラー・JSON変換エラーがつきものです。


例:天気情報APIを取得する(安全版)

async function getWeather(city) {
  try {
    const res = await fetch(`https://api.example.com/weather?city=${city}`);
    if (!res.ok) {
      throw new Error(`HTTPエラー: ${res.status}`);
    }

    const data = await res.json(); // JSON変換
    console.log("天気情報:", data);
    return data;

  } catch (e) {
    console.error("API呼び出しでエラー:", e.message);
    return null;
  } finally {
    console.log("API処理終了");
  }
}

// 実行例
getWeather("Tokyo");
JavaScript

解説

ステップ内容例外が起きる可能性
fetch()通信が失敗ネットワークが落ちている
res.ok チェックHTTPエラー検出404 / 500 など
res.json()JSONが壊れているSyntaxError
catch(e)どの時点のエラーでも受け取る✅ キャッチ可能
finally通信が成功・失敗どちらでも呼ばれる✅ 常に実行

応用:再試行(リトライ)する

APIが一時的に失敗することもあります。
そこで、例外をキャッチして一定回数再試行するのもよくあるパターンです。

async function fetchWithRetry(url, maxRetry = 3) {
  for (let i = 0; i < maxRetry; i++) {
    try {
      const res = await fetch(url);
      if (!res.ok) throw new Error("HTTP error " + res.status);
      return await res.json();
    } catch (e) {
      console.warn(`試行${i + 1}回目失敗: ${e.message}`);
      if (i === maxRetry - 1) {
        console.error("全試行失敗:", e);
        return null;
      }
      await new Promise(r => setTimeout(r, 1000)); // 1秒待って再試行
    }
  }
}
JavaScript

📘 ポイント

  • 「再試行処理」は、APIや外部サービスを扱うときによく使う。
  • await new Promise(r => setTimeout(r, 1000)) は「待機処理(sleep)」。

3. 例外の種類とデバッグのコツ

種類説明よく出るシーン
ReferenceError定義してない変数を使ったundefinedVariable
TypeError型が違う/関数でないものを呼び出したnull.toUpperCase()
SyntaxError文法エラー・JSON不正JSON.parse("{name:}")
RangeError範囲外の値配列長を負にしたなど
Error自作の一般的なエラーthrow new Error("失敗")

🪄 デバッグのヒント

catch (e) {
  console.error("メッセージ:", e.message);
  console.error("エラー種類:", e.name);
  console.error("スタック:", e.stack);
}
JavaScript

.stack を見ると「どの行」で起きたかわかる(非常に便利!)


4. まとめ

ポイント内容
try...catch失敗しても止まらない安全設計の基本
throw new Error()意図的に例外を出して呼び出し元に伝える
finallyファイルクローズ・後片付けに使う
e.code / e.nameエラーの種類を見分ける
✅ 非同期処理も try/catchawait で例外を捕まえる

練習問題(実践向け)

問題1:安全なファイル書き込み関数

ファイルを書き込む saveData(filePath, data) 関数を作ろう。

  • JSON 形式に変換 (JSON.stringify)
  • 書き込み失敗時はログを出して false を返す
  • 成功時は true を返す

問題2:API呼び出し結果をファイルに保存

getWeather(city) の結果を weather.json に保存しよう。

  • API呼び出しで失敗したら「保存せず null を返す」
  • 書き込み失敗もキャッチして安全に終了する
タイトルとURLをコピーしました