ここでは、JavaScriptの try…catch 文を
「初心者 → 中級 → 上級」 の3段階で、
例題+解答+詳しい解説つきで紹介します。
目次
- 🔰 初級(基本構文と動きの理解)3問
- ⚙️ 中級(実用的な関数の中での使い方)3問
- 🚀 上級(非同期処理や再スローを含む応用)3問
- ✅ まとめと学習のポイント
初級編: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
解説
tryの中の"A"は実行される。throw new Error("エラー発生")で例外が発生 → 以降の"B"はスキップされる。catchに飛んで"C"を実行。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 は「エラーを防ぐ」ためではなく、
「起きても安全に続ける」ための仕組みです。
💡 初心者のうちは、
- どの行でエラーが起きるかを想像する
- その周囲を
tryで包むconsole.error(e)で中身を観察する
という練習を繰り返すのが上達の近道です。

