例外処理
Exception Handling
概要(サマリー)
例外処理(Exception Handling)とは、プログラムの実行中に何らかの予期しない問題(エラー)が発生した際、システムをフリーズさせたり強制終了(クラッシュ)させたりすることなく、安全に代わりの処理を行ってプログラムを実行し続ける、または安全に終了させるための仕組みである。
現代のアプリケーション開発において、システムの信頼性と耐久性を保つために不可欠な設計技術である。
詳細解説
1. プログラミングにおける「例外」とは
文法上の間違いであるシンタックスエラーとは異なり、コードの記述自体は正しいものの、プログラムを動かした際に周囲の状況やデータの不備によって発生する想定外のランタイムエラーを「例外(Exception)」と呼ぶ。
代表的な例外には、以下のようなケースがある。
- インターネット接続が一時的に途切れてデータを取得できなかった
- 読み込もうとしたファイルが指定された場所に存在しなかった
- 割り算の分母に誤って
0が渡された(ゼロ除算) - 入力フォームに想定外のデータ形式(数値のはずが文字列など)が送信された
2. 例外処理を行わない場合のリスク
もしプログラム内で何の対策(例外処理)も施していない状態で例外が発生すると、コンピュータはその時点で処理を即座に中断する。
その結果、スマートフォンアプリが突然強制終了してホーム画面に戻ってしまったり、Webサイトの画面が完全に真っ白になって固まったりするなど、著しくユーザー体験(UX)を損なうことになる。
最悪の場合、処理途中のデータがデータベースに正しく保存されず、データが破損するリスクも発生する。
3. 基本的な実装方法(try-catch構文)
多くのプログラミング言語では、例外が発生しそうな部分を try ブロックで囲み、発生時の対処法を catch ブロック(Pythonでは except)に記述する try-catch という構文が使われる。
以下は、JavaScriptを用いた例外処理の基本的な記述例である。
function divide(a, b) {
try {
if (b === 0) {
// 意図的に例外を発生させる(投げる)
throw new Error("0で割ることはできません。");
}
const result = a / b;
console.log(`計算結果: ${result}`);
} catch (error) {
// 例外が発生したときの代わりの処理
console.warn("計算エラーが発生しました。");
console.error(`詳細内容: ${error.message}`); // エラーログの出力
} finally {
// 例外の有無にかかわらず、最後に必ず実行される処理
console.log("計算処理を終了します。");
}
}
// 正常な呼び出し
divide(10, 2);
// 例外が発生する呼び出し(クラッシュせず安全にキャッチされる)
divide(10, 0);
上記のコード例では、divide(10, 0) を実行した際にもプログラム全体が強制終了することはなく、catch ブロックへと安全に処理が誘導され、原因となった例外情報がエラーログとしてコンソールに出力される。
4. 適切な例外処理の書き方(バグの握り潰しを防ぐ)
例外処理を書く際、発生したエラーを完全に無視して catch の中身を空にしてしまう(「バグの握り潰し」と呼ぶ)書き方は避けるべきである。
エラーの発生に開発者が気付けなくなり、システムの裏で不具合が発生し続ける原因になる。
例外処理では、必ずエラーの内容をログに記録し、ユーザーに対しては「一時的なエラーが発生しました。時間をおいて再度お試しください」といった分かりやすいメッセージや、代替データ(フォールバック)を表示するのが適切なエラーハンドリングである。
AIコーディングとの関係
AIエージェントにプログラムの作成を依頼した際、AIは「すべてが正常に動作するケース(ハッピーパス)」のコードばかりを優先して生成し、例外処理を記述し忘れる傾向がある。
例えば、外部APIと通信するプログラムにおいて例外処理が抜けていると、APIサーバーが1秒間ダウンしただけで、自社のWebシステム全体が道連れになってクラッシュしてしまう。
この問題を避けるため、AIにコーディングを指示する際は、「外部サーバーからのデータ取得処理には、接続タイムアウトや通信エラーを想定した try-catch による例外処理を必ず実装し、エラー時にはダミーデータを返す設計に書き換えて」と明示的に指示を出すことで、実用に耐える強固なコードを出力させることができる。
よくある勘違い
例外処理を多用するとプログラムの動作速度が劇的に遅くなる?
いいえ、通常の正常な処理が実行されている間は、try ブロックで囲まれていてもプログラムの実行速度はほとんど低下しない。例外が発生した瞬間のみ、エラー情報の組み立てや処理のジャンプによってわずかな負荷(オーバーヘッド)が生じるが、システムがクラッシュするリスクを回避できるメリットに比べれば無視できるレベルである。
すべてのコードを例外処理で囲めば、バグがない完璧なアプリになる?
いいえ、例外処理は「発生したエラーに対する事後処理」を行うだけであり、エラーそのものの根本原因(論理的な計算ミスの不具合など)を自動で修正してくれるわけではない。本質的なプログラムのバグは、開発者自身が原因を特定して修正する必要がある。
「例外処理」と「エラーハンドリング」は別の技術?
ほぼ同じ意味として使われることが多いが、厳密には「エラーハンドリング」という大きな設計概念の中に、プログラミング言語の機能(try-catchなど)を用いて実装する「例外処理」という手段が含まれているという関係である。
まとめ
- 例外処理は、実行中に起きた想定外のエラーによるシステムのクラッシュを防ぐ仕組みである
- 例外が起きた場合は、エラーログを記録しつつ、ユーザーに分かりやすい案内や代替データを返す
- AIにコードを書かせる際は、例外処理の書き漏らしがないか厳重に確認する
情報ソース
より詳しくAIに聞いてみよう
- JavaScriptにおける「Errorオブジェクト」の種類(TypeError, ReferenceErrorなど)と、catchした際にエラーの種類を判定する方法を教えてください。
- AIを使って、Pythonの
try-except-else-finally構文の適切な使い分けとサンプルコードを生成するプロンプトを教えてください。 - 例外処理において、エラー情報をログ管理サーバー(Sentryなど)に自動送信して開発チームにチャット通知する仕組みの作り方を教えてください。
- プログラムコード中で独自の例外ルールを作成する「カスタム例外(自作エラークラス)」の定義方法と、どのような場面で使うべきか具体例を挙げて教えてください。
- 非同期処理(async/await)を使用する際の、JavaScriptでの適切な try-catch 例外処理の書き方を教えてください。