ここからは、初心者でも「実務っぽい」感覚をつかめるように、
ファイル操作 と API 呼び出し の2つの実践例を、
図解+ステップ式でかみ砕いて説明します。
目次
- ファイル操作での例外処理(Node.js 編)
- API 呼び出しでの例外処理(fetch / async-await 編)
- 例外の種類とデバッグのコツ
- まとめ+練習問題
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.code や instanceof で原因別に処理するのが、実務では重要です。
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/catch | await で例外を捕まえる |
練習問題(実践向け)
問題1:安全なファイル書き込み関数
ファイルを書き込む saveData(filePath, data) 関数を作ろう。
- JSON 形式に変換 (
JSON.stringify) - 書き込み失敗時はログを出して
falseを返す - 成功時は
trueを返す
問題2:API呼び出し結果をファイルに保存
getWeather(city) の結果を weather.json に保存しよう。
- API呼び出しで失敗したら「保存せず null を返す」
- 書き込み失敗もキャッチして安全に終了する

