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

JavaScript
スポンサーリンク

ここでは、JavaScriptの try…catch
「初心者 → 中級 → 上級」 の3段階で、
例題+解答+詳しい解説つきで紹介します。


目次

  1. 🔰 初級(基本構文と動きの理解)3問
  2. ⚙️ 中級(実用的な関数の中での使い方)3問
  3. 🚀 上級(非同期処理や再スローを含む応用)3問
  4. ✅ まとめと学習のポイント

初級編:try…catch の基本理解


Q1. 例外が発生したときに catch が呼ばれるのはどこ?

次のコードを実行したとき、出力される順番を考えてください。

try {
  console.log("A");
  throw new Error("エラー発生");
  console.log("B");
} catch (e) {
  console.log("C");
}
console.log("D");
JavaScript

解答

A
C
D

解説

  1. try の中の "A" は実行される。
  2. throw new Error("エラー発生") で例外が発生 → 以降の "B" はスキップされる。
  3. catch に飛んで "C" を実行。
  4. catch が終わると "D" に進む。

💡 ポイントthrow で例外が発生した瞬間、try の残りの行はスキップ!


Q2. 変数が存在しないときの動作をキャッチする

try {
  console.log(value);
} catch (e) {
  console.log("エラーをキャッチ:", e.name);
}
JavaScript

解答

エラーをキャッチ: ReferenceError

解説

  • value は定義されていないので、ReferenceError が発生。
  • catch (e) でそのエラーを受け取る。
  • e.name プロパティは "ReferenceError"

💡 ポイントcatch の変数 e の中には Error オブジェクトが入る(name, message, stack が使える)。


Q3. finally の動作を確認

try {
  console.log("処理開始");
  throw new Error("問題発生");
} catch (e) {
  console.log("catch:", e.message);
} finally {
  console.log("終了処理");
}
JavaScript

解答

処理開始
catch: 問題発生
終了処理

解説

  • finally例外があってもなくても必ず実行 される。
  • 後片付けやリソース解放(ファイルを閉じるなど)に使うのが定番。

中級編:実用的な例(関数・入力チェック)


Q4. JSON.parse を安全に使う

function safeParse(text) {
  try {
    return JSON.parse(text);
  } catch (e) {
    console.error("パース失敗:", e.message);
    return null;
  }
}

console.log(safeParse('{"name":"Halu"}')); // ?
console.log(safeParse("{name:}"));         // ?
JavaScript

解答

{ name: "Halu" }
パース失敗: Unexpected token n in JSON at position 1
null

解説

  • JSON.parse は文法エラーを出すと SyntaxError をスロー。
  • try…catch で包むことで、プログラム全体を止めずに安全に処理できる。

💡 実務で頻出! フォーマット不明な外部データを扱うときは必須テク。


Q5. ユーザー入力のチェック

function divide(a, b) {
  try {
    if (b === 0) throw new Error("0で割ることはできません");
    return a / b;
  } catch (e) {
    console.error("エラー:", e.message);
    return null;
  }
}

console.log(divide(6, 2)); // ?
console.log(divide(6, 0)); // ?
JavaScript

解答

3
エラー: 0で割ることはできません
null

解説

  • throw new Error("…") で自分で例外を投げられる。
  • catch 側で受け取り、安全に終了。
  • 「異常値を見つけたらthrow」は、堅牢なコードの基本。

Q6. ファイル読み込みの安全版(Node.js)

const fs = require("fs");

function loadFile(path) {
  try {
    const text = fs.readFileSync(path, "utf8");
    return text;
  } catch (e) {
    console.error("読み込み失敗:", e.code);
    return null;
  }
}

console.log(loadFile("data.txt"));
console.log(loadFile("missing.txt"));
JavaScript

解答

(data.txt の中身)
読み込み失敗: ENOENT
null

解説

  • fs.readFileSync はファイルが存在しないと ENOENT エラーをスロー。
  • e.code でエラー種別を識別できる。
  • 実務では「存在しない」「権限がない」などを分けて処理するのが一般的。

上級編:非同期と再スロー(rethrow)


Q7. fetch + async/await の例外処理

async function getData() {
  try {
    const res = await fetch("https://example.com/data.json");
    if (!res.ok) throw new Error("HTTPエラー: " + res.status);
    return await res.json();
  } catch (e) {
    console.error("通信失敗:", e.message);
    return null;
  }
}

getData();
JavaScript

解説

  • await fetch()await res.json() が失敗すると自動的に例外を投げる。
  • try…catch で包むことで、通信エラーを安全に処理できる。
  • 実務でAPI呼び出しを扱うときの必須パターン。

Q8. catchの中で再スロー(rethrow)

function processData() {
  try {
    throw new Error("内部エラー");
  } catch (e) {
    console.error("内部ログ:", e.message);
    throw e; // ← もう一度投げ直す
  }
}

try {
  processData();
} catch (e) {
  console.log("呼び出し側で処理:", e.message);
}
JavaScript

出力

内部ログ: 内部エラー
呼び出し側で処理: 内部エラー

解説

  • catch の中でログだけ残して再スロー(throw e)することで、
    呼び出し元にも通知できる。
  • これは 「中で記録して、外で最終処理」 という実務的パターン。

Q9. ネストした try…catch

try {
  try {
    JSON.parse("{x:}"); // SyntaxError
  } catch (e) {
    console.warn("内部で処理できなかった:", e.message);
    throw new Error("上位に伝える");
  }
} catch (e) {
  console.error("外側で最終処理:", e.message);
}
JavaScript

出力

内部で処理できなかった: Unexpected token x in JSON at position 1
外側で最終処理: 上位に伝える

解説

  • 内側の catch でログを出しつつ、
    throw で外側の catch に「伝搬」している。
  • 実務でも「モジュール内で部分的に補足し、
     最終的には呼び出し元で統一的に処理する」設計に使う。

まとめ(学習ポイント)

レベル学ぶポイント代表例
🔰 初級try…catch の流れを理解throw new Error() の基本
⚙️ 中級関数の中で安全に使うJSON.parse, divide など
🚀 上級async/await・再スローfetch通信, ネスト構造

最後に

try…catch は「エラーを防ぐ」ためではなく、
「起きても安全に続ける」ための仕組みです。

💡 初心者のうちは、

  1. どの行でエラーが起きるかを想像する
  2. その周囲を try で包む
  3. console.error(e) で中身を観察する
    という練習を繰り返すのが上達の近道です。
タイトルとURLをコピーしました