【2026年9月最新】JavaScriptのtry...catchの使い方と例外処理完全ガイド|throw・finally・非同期エラーまで
「JavaScriptでtry...catchってどう書けばいいの?」「throwとErrorオブジェクトの関係がよくわからない」——この記事にたどり着いたあなたは、おそらくそんな疑問を抱えているはずです。
try...catchは、JavaScriptで「処理中に予期しないエラーが起きても、プログラム全体を止めずに対処する」ための構文です。フォーム入力のバリデーション、API通信、ファイル操作——エラーが起こりうる処理には必ずと言っていいほど登場します。にもかかわらず、finallyの実行タイミングやErrorオブジェクトの種類、非同期処理での例外処理まで正確に理解している人は多くありません。
この記事では、try...catchの基本構文から応用テクニックまでを実例付きで整理します。さらに後半では、弊社(株式会社GENAI)がClaude Codeという AIエージェントを使ってエラー処理のコードをどう扱っているかという、2026年時点のもうひとつの現実的な選択肢も紹介します。
この記事を最後まで読むと、次の6つが明確になります。
01 BASIC SYNTAX try...catchとは何か・基本構文を理解する 「エラーで処理が止まる」を防ぐ仕組み
try...catchは、「エラーが起きるかもしれない処理」をtryブロックに書き、実際にエラーが起きたときの対処をcatchブロックに書く構文です。まずは最小限の形を見てみましょう。
try {
const result = JSON.parse('{invalid json}');
console.log(result);
} catch (error) {
console.log('エラーが発生しました:', error.message);
}
// 出力: エラーが発生しました: Unexpected token i in JSON
📚 用語解説
try...catch文:JavaScriptでエラー処理を行うための構文。「try」ブロック内でエラーが発生すると、その場でtryブロックの残りの処理は中断され、即座に「catch」ブロックに処理が移る。エラーが発生しなければcatchブロックは実行されません。
もしtry...catchを使わずに上記のコードを実行すると、JSON.parseの時点でエラーが発生し、それ以降のJavaScriptの処理が全て止まってしまいます。try...catchで囲むことで、エラーが起きても処理を継続させたり、ユーザーに分かりやすいメッセージを表示したりできます。
すべてのコードをtry...catchで囲む必要はありません。外部APIとの通信、ユーザー入力の解析、ファイルの読み書きなど、「失敗する可能性が現実的にある処理」に絞って使うのが基本です。使いすぎると、本来気づくべきバグまで握りつぶしてしまうことがあります。
1-1. catchの引数(error)から情報を取り出す
catchブロックの引数には、発生したエラーの情報が入ったErrorオブジェクトが渡されます。よく使うプロパティは以下の2つです。
try {
null.foo(); // null にはfooというプロパティがない
} catch (error) {
console.log(error.name); // 'TypeError'
console.log(error.message); // 'Cannot read properties of null...'
}
📚 用語解説
Errorオブジェクト:JavaScriptでエラー情報を表現するためのオブジェクト。name(エラーの種類)、message(エラー内容の説明文)、stack(エラー発生箇所の履歴)といったプロパティを持ちます。catchブロックの引数として自動的に渡されます。
02 THROW STATEMENT throwで意図的にエラーを発生させる 「これはおかしい」をプログラムに伝える方法
throw文を使うと、自分の書いたコードの中で「これは異常な状態だ」と判断した時点で、意図的にエラーを発生させることができます。
function divide(a, b) {
if (b === 0) {
throw new Error('0で割ることはできません');
}
return a / b;
}
try {
console.log(divide(10, 0));
} catch (error) {
console.log(error.message); // 0で割ることはできません
}
📚 用語解説
throw文:任意のタイミングで意図的にエラーを発生させるための文。throw new Error('メッセージ')という形で書くのが一般的で、throwされたエラーは、最も近い外側のtry...catchのcatchブロックに渡されます。
throwが便利なのは、「JavaScript自体はエラーだと判断しないが、業務ロジック上は明らかにおかしい」ケースを扱えることです。例えば「割り算をゼロで行う」こと自体はJavaScriptの文法エラーではありませんが、業務上は異常な状態として扱いたい、といった場面で使います。
2-1. Errorオブジェクトの種類を見分ける
JavaScriptには、エラーの原因ごとにあらかじめ用意された組み込みErrorオブジェクトが複数あります。catchしたエラーの種類を見分けることで、より的確な対処が可能になります。
| エラーの種類 | 主な発生原因 | 具体例 |
|---|---|---|
| TypeError | 値の型が期待と異なる操作をした | nullのプロパティにアクセスした |
| ReferenceError | 存在しない変数を参照した | 定義していない変数をconsole.logした |
| SyntaxError | コードの文法が誤っている | JSON.parseに不正な文字列を渡した |
| RangeError | 値が許容範囲を超えている | 配列の長さに負の数を指定した |
| Error | 上記に当てはまらない一般的なエラー | throw new Error()で独自に発生させたもの |
📚 用語解説
TypeError / ReferenceError:いずれもJavaScriptの組み込みエラーの種類。TypeErrorは「値の型に対して不正な操作をした」場合(例: nullに対してメソッドを呼んだ)に、ReferenceErrorは「定義されていない変数を参照した」場合に自動的に発生します。エラーの種類が分かれば、原因の見当がつけやすくなります。
エラーメッセージの文言はJavaScriptの実行環境(ブラウザやNode.jsのバージョン)によって微妙に異なることがあります。原因を正確に特定するには、メッセージだけでなくerror.name(エラーの種類)と、次章で紹介するerror.stack(発生箇所の履歴)を合わせて確認するのが安全です。
03 FINALLY BLOCK finally文で「必ず実行される処理」を書く エラーの有無に関わらず後片付けをする方法
try...catchには、finallyというもう1つのブロックを追加できます。finallyブロックは、エラーが起きても起きなくても、必ず最後に実行されるという特徴があります。
function processData(data) {
console.log('処理開始');
try {
if (!data) {
throw new Error('データが空です');
}
console.log('処理成功:', data);
} catch (error) {
console.log('エラー:', error.message);
} finally {
console.log('後片付け処理を実行');
}
}
processData(null);
// 出力:
// 処理開始
// エラー: データが空です
// 後片付け処理を実行
📚 用語解説
finally文:try...catchの最後に付け加えられるブロックで、tryが成功した場合・catchでエラーを捕まえた場合のどちらでも必ず実行される処理を書く場所。ファイルのクローズ処理、ローディング表示の解除など、「後片付け」が必要な処理でよく使われます。
finallyが特に重要になるのは、「エラーの有無に関わらず絶対にやっておきたい処理」がある場合です。例えば「通信中はローディング画面を出す」という実装では、通信が成功しても失敗しても、最後に必ずローディング画面を消す必要があります。この「必ず消す」をfinallyに書けば、書き漏れを防げます。
try・catch・finallyの実行順序を図にすると、以下のように「成功時」も「失敗時」も、最後は必ずfinallyを通過する流れになります。
実行
エラーが
起きるか確認
/失敗→catchへ
分岐が発生
エラー処理
(失敗時のみ)
必ず実行
成功・失敗
どちらも通過
finallyブロックの中でreturnを書くと、tryやcatchの中のreturn・throwの結果が上書きされてしまい、非常に分かりにくいバグの原因になります。finallyは「後片付け」に徹し、値を返す処理は書かないのが安全な使い方です。
3-1. 複数の種類のエラーを条件分岐で処理する
1つのcatchブロックの中で、instanceofを使ってエラーの種類ごとに処理を分けることもできます。
try {
riskyOperation();
} catch (error) {
if (error instanceof TypeError) {
console.log('型のエラーです:', error.message);
} else if (error instanceof RangeError) {
console.log('範囲のエラーです:', error.message);
} else {
console.log('その他のエラー:', error.message);
}
}
04 ERROR DETAILS エラー情報を活用する・関数として共通化する stackプロパティと、実務で使えるエラーハンドリング設計
Errorオブジェクトには、messageやname以外にstackというプロパティもあります。これは「そのエラーが、どの関数のどの行から発生したか」という履歴(スタックトレース)を文字列で保持しています。
function level3() { throw new Error('問題発生'); }
function level2() { level3(); }
function level1() { level2(); }
try {
level1();
} catch (error) {
console.log(error.stack);
// Error: 問題発生
// at level3 (...)
// at level2 (...)
// at level1 (...)
}
📚 用語解説
スタックトレース (stack):エラーが発生するまでに、どの関数がどの順番で呼び出されたかを記録した履歴のこと。error.stackを見れば「最終的にどの関数でエラーが発生したか」だけでなく「そこに至るまでの呼び出し経路」まで一目で分かるため、原因調査(デバッグ)に非常に役立ちます。
実務のコードでは、同じようなエラー処理を何度も書くのを避けるため、エラーハンドリングを関数として共通化することがよくあります。
function handleError(error, context = '') {
console.error(`[${context}] ${error.name}: ${error.message}`);
// ここでログ送信やユーザー通知処理をまとめて行う
}
try {
JSON.parse('invalid');
} catch (error) {
handleError(error, '設定ファイルの読み込み');
}
エラーメッセージだけを表示・記録すると、後から見返したときに「どの処理で起きたエラーか」が分からなくなりがちです。上記のようにコンテキスト(どの処理か)を一緒に記録する癖をつけると、後の原因調査が格段に楽になります。
05 ASYNC ERROR HANDLING async/awaitでの例外処理 非同期処理特有の「エラーが捕まえられない」問題を避ける
API通信など非同期処理でも、async/awaitと組み合わせることでtry...catchが使えます。ただし、書き方を誤るとエラーがcatchされずにすり抜けてしまうことがあるため注意が必要です。
async function fetchUserData(userId) {
try {
const response = await fetch(`/api/users/${userId}`);
if (!response.ok) {
throw new Error(`APIエラー: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.log('ユーザー取得に失敗:', error.message);
return null;
}
}
📚 用語解説
async / await:非同期処理(結果が返ってくるまで時間がかかる処理)を、あたかも同期処理のように上から順番に書けるようにするJavaScriptの構文。awaitを付けた処理でエラーが発生すると、通常の同期処理と同じようにcatchブロックでエラーを捕まえられます。
async/awaitを使わず.then()を使った書き方の場合、コールバック関数の外側にあるtry...catchではエラーを捕まえられません。非同期処理のエラーは.catch()メソッドを使うか、async/awaitに統一して書くのが安全です。
5-1. 複数の非同期処理をまとめてエラー処理する
Promise.allのように複数の非同期処理を同時に実行する場合も、外側をtry...catchで囲めば、いずれか1つでも失敗した時点でまとめて捕まえられます。
async function fetchAll() {
try {
const [users, orders] = await Promise.all([
fetch('/api/users').then(r => r.json()),
fetch('/api/orders').then(r => r.json()),
]);
return { users, orders };
} catch (error) {
console.log('いずれかの取得に失敗:', error.message);
return null;
}
}
06 CAUTIONS try...catchを使う上での注意点 continue/breakが使えない・パフォーマンスへの影響
try...catchには、知らないとハマりやすい2つの落とし穴があります。
6-1. ループの中でcontinue/breakを使う際の書き方
try...catchブロックの外にあるループに対して、catchブロックの中からcontinueやbreakを使うこと自体は可能ですが、tryブロックの外にあるループ変数のスコープなど、書き方によっては意図しない挙動になることがあります。
const items = [1, 2, 0, 4];
for (const item of items) {
try {
if (item === 0) {
throw new Error('0はスキップします');
}
console.log(10 / item);
} catch (error) {
console.log(error.message);
continue; // catchの中からループを継続できる
}
}
ループ処理の中で「1件失敗しても残りは処理を続けたい」場合は、この記事のコード例のようにfor文の内側にtry...catchを配置するのが定石です。逆にtry...catchでループ全体を囲んでしまうと、1件のエラーで全件の処理が止まってしまいます。
6-2. try...catchはパフォーマンスに影響するか
「try...catchは遅い」という話を聞いたことがある方もいるかもしれません。現在の主要なJavaScriptエンジン(V8など)では、try...catchブロック自体のオーバーヘッドはほぼ無視できるレベルまで最適化されています。
性能面での懸念よりも、「本来ならif文で防げるはずのケースまでtry...catchに頼っていないか」という設計面のほうが重要です。例えば「引数が数値かどうか」は事前にif文でチェックできるのに、わざわざtry...catchでエラーを起こしてから処理する書き方は、コードの意図を分かりにくくします。
07 AI-ASSISTED CODING 【独自】エラー処理コードを「書く」から「AIに指示する」へ 非エンジニアがtry...catchを書かずに堅牢な処理を実現する方法
ここまでtry...catchの基礎と応用を一通り解説してきましたが、正直なところに触れます。2026年現在、経営者や非エンジニアの方が、Errorオブジェクトの種類やスタックトレースの読み方をすべて暗記して自力でコードを書く必要は薄れてきています。
理由は明確で、Claude CodeのようなAIコーディングエージェントに「やりたいこと」を日本語で伝えるだけで、try...catch・throw・finallyを適切に配置した堅牢なコードを、AIが自動で書いて実行までしてくれるようになったからです。
📚 用語解説
Claude Code:Anthropicが提供するAIコーディングエージェント。ターミナルやデスクトップアプリ上で「やりたいこと」を日本語で伝えると、ファイルの読み書き・コードの生成・実行までを自律的に行います。try...catchのようなエラー処理構文の正確な書き方を暗記していなくても、堅牢な業務自動化の仕組みを実現できます。
とはいえ、「try...catchが何をしているか」を理解していることには依然として価値があります。AIが生成したエラー処理が妥当かを確認したり、「このエラーが出たときはこう対処してほしい」と的確に指示を出したりするには、最低限の構文理解が役に立つからです。
失敗しうる処理を
日本語で伝える
(例: API通信)
AIがtry-catch-
finallyを含む
コードを生成
AIがコードを
実行し、失敗ケースも
検証
結果を見て
「この場合は
リトライして」と指示
7-1. どんな業務がエラー処理の自動化で楽になるか
try...catchが活躍する場面は、突き詰めると「外部とのやり取りで失敗する可能性がある処理」すべてです。以下のような業務は、まさにエラー処理を含む自動化で工数とトラブルが大きく減る典型例です。
弊社の実感では、これからの現場に必要なのは「try...catchを正確に書けるエンジニア」を採用することよりも、「この処理はどこで失敗しうるか、失敗したらどうしてほしいかを、AIエージェントに正確な日本語で指示できる人」を社内に増やすことです。この記事のような基礎知識は、まさにその「正確な指示」を出すための土台になります。
08 GENAI CASE STUDY 【独自データ】GENAI社内のエラー処理設計・自動化事例 Claude Codeで「失敗に強い仕組み」をどこまで自動化しているか
ここでは、弊社(株式会社GENAI)が実際にClaude Codeを使って、try...catch的な「エラーへの備え」をどのように業務システムに組み込んでいるかを、数値と事例ベースで公開します。
8-1. 弊社の契約プランと導入範囲
| 項目 | 内容 |
|---|---|
| 契約プラン | Claude Max 20x(月$200 / 約30,000円) |
| 利用開始 | 2025年後半〜 |
| 利用部署 | 経営・営業・広告・開発・経理・秘書業務・個人業務まで全社 |
| エラー処理設計の主な用途 | API連携の自動リトライ、バッチ処理失敗時のSlack通知、データ検証エラーのログ化 |
8-2. エラー処理・自動化による削減時間(肌感ベース・2026年4月時点)
| 業務領域 | 主な用途(エラー処理を含む自動化) | 概算削減時間 |
|---|---|---|
| 広告運用 | API連携の失敗を自動検知しSlack通知、手動対応を削減 | 週10時間 → 週1時間 |
| 経理 | 請求書データの検証エラーを自動でログ化・仕分け | 月40時間 → 月5時間 |
| 開発 | LP・WordPressの投稿処理失敗時の自動リトライ実装 | 都度数時間削減 |
| 秘書業務 | カレンダー連携の失敗時に自動で担当者へ通知 | 日2時間 → 日15分 |
| 営業 | 見積書生成の入力エラーを事前検知して差し戻し | 週20時間 → 週2時間 |
上記は弊社の肌感ベースの数値であり、業種・業態・担当者のスキルによって削減時間は変動します。あくまで「エラー処理を含む自動化をAIに任せるとどの程度まで使い倒せるか」の参考情報としてご覧ください。
例えば広告運用では、以前は各種広告APIとの連携が失敗した際に人が気づいて手動でリトライしていましたが、現在はClaude Codeに「このAPI連携が失敗したら3回まで自動リトライして、それでもダメならSlackに通知して」と指示するだけで、人間が書けば数十行のtry-catch-finallyに相当する処理を数分で実装しています。
09 CONCLUSION まとめ ── try...catchを理解すると、AI指示の精度も上がる 基礎を押さえた上で、「書く」作業自体はAIに任せる選択肢を持つ
この記事では、JavaScriptのtry...catchの基本構文から、throw・Errorオブジェクトの種類・finally・スタックトレース・async/awaitでの例外処理・注意点までの応用テクニック、そしてAIエージェントにコードを書かせるという現実的な選択肢までを整理しました。最後にポイントを振り返ります。
最も重要なメッセージをお伝えします。try...catchの理解は「自分でコードを書くため」だけでなく、「AIに正確な指示を出すため」の土台としても価値があります。構文の意味がわかっていれば、AIが生成したエラー処理の妥当性を判断でき、修正の指示も的確に出せるようになります。
弊社では、Claude Codeを使った業務自動化の設計から伴走まで支援する「AI鬼管理」というサービスを提供しています。エラー処理の設計に限らず、社内のシステムを「失敗に強い仕組み」にどこまで近づけられるか。気になる方は、ぜひ以下からお気軽にご相談ください。
「失敗に強い仕組み」づくり、AI鬼管理が一緒に設計します
try...catchを自分で書くか、AIに任せるか。
あなたの会社のシステムやオペレーションの「失敗しうるポイント」を棚卸しして、最適な対策を一緒に考えます。
ここから先の進め方は、大きく2つあります。
自社で回せるようになりたい方は、AI鬼管理でClaude Code/Codexの使い方から業務設計・社内定着まで伴走を受けながら、社内に仕組みを作る道があります。
覚えるより任せたい方は、AI社員AIKATAでこの記事のような定型業務を丸ごと預ける道があります。料金は月30万円の月額定額、追加費用は0円です。
どちらが合うかは、業務量と社内体制次第です。無料相談・無料適合診断で、貴社の場合はどちらが向くかからご相談いただけます。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. try...catchとif文による事前チェック、どちらを使うべきですか?
A. 「事前に条件を確認できるもの」はif文で防ぎ、「外部要因で予測しきれないもの(通信断・ファイル破損など)」はtry...catchで対処するのが基本の使い分けです。両方を組み合わせて使うのが実務では一般的です。
Q. catchブロックで何もしない(空のcatch)のはよくないですか?
A. 基本的には避けるべきです。エラーを握りつぶしてしまうと、後で原因不明の不具合として発覚し、調査が難航します。最低限console.errorでログに残すか、コメントで「無視して問題ない理由」を明記しておくことを推奨します。
Q. finallyの中でエラーが発生した場合はどうなりますか?
A. finallyブロック内で新たにエラーが発生すると、そのエラーが優先され、tryやcatchで処理していた元のエラー情報は上書きされてしまいます。finallyブロックの中身は、エラーが起きにくいシンプルな処理に留めるのが安全です。
Q. 独自のエラークラスを作ることはできますか?
A. できます。class ValidationError extends Error {}のように組み込みのErrorクラスを継承すれば、独自の名前を持つエラークラスを定義できます。instanceofで判定できるため、業務固有のエラー種別を扱う際に便利です。
Q. try...catchはPythonの例外処理と考え方は同じですか?
A. 基本的な考え方(正常系と異常系を分けて書く)は共通していますが、構文は異なります。Pythonはtryとexceptとfinallyでelseも使え、JavaScriptはtry・catch・finallyの3つで構成されます。言語ごとに用意されているErrorの種類も異なるため、対応表で確認するのが確実です。
Q. プログラミング未経験でもClaude Codeでエラー処理を含むコードは実現できますか?
A. 実現できます。Claude Codeは「この処理が失敗したら3回まで自動でやり直して、それでもダメなら担当者に通知して」といった日本語の指示から、必要なtry-catch-finallyを含むコードを自動で生成・実行します。この記事の基礎知識があれば、生成結果の妥当性もより正確に判断できます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AI社員AIKATAへのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




