例外処理 れいがいしょり
簡単に言うとこんな感じ!
プログラムが「想定外のこと」に遭遇したとき、クラッシュせずに「こう対応してね」とあらかじめ決めておく仕組みだよ!たとえば「ファイルが見つからなかったらエラーメッセージを出す」みたいな感じで、プログラムを丈夫にする安全網なんだ!
例外処理とは
プログラムは書いた通りに動くとは限りません。ネットワークが切れる、ファイルが存在しない、ユーザーが数字を入れるべき欄に文字を入力する――こうした「想定外の出来事」が起きたとき、何も対策がなければプログラムは突然止まってしまいます。例外処理(Exception Handling) とは、そうした異常な状態(=「例外」)が発生したときにどう対応するかをあらかじめコードに書いておく仕組みです。
例外処理がなければ、エラーはそのままシステム全体を道連れにしかねません。一方、適切に例外処理を実装すると、エラーが起きてもユーザーに分かりやすいメッセージを見せたり、安全な状態に復帰したり、ログに記録したりできます。現代のソフトウェア開発において、例外処理はシステムの堅牢性・信頼性を左右する重要な設計要素です。
システム発注・開発委託をする立場から見ると、「エラーが起きたときにどう動くか」の仕様を明確に決めておくことが非常に重要です。例外処理の設計が甘いシステムは、本番環境で突然止まったり、原因不明のデータ不整合を起こしたりするリスクがあります。
例外処理の基本構造
例外処理は「監視する→捕まえる→対応する→後始末する」という流れで組み立てます。多くのプログラミング言語が共通して持つ構造です。
| ブロック名 | 役割 | 言語での表現例 |
|---|---|---|
| try | 例外が起きるかもしれない処理を囲む「監視ゾーン」 | try { ... } |
| catch | 例外が発生したときに実行する対応処理 | catch (e) { ... } |
| finally | 例外の有無にかかわらず必ず実行する後始末 | finally { ... } |
| throw | 意図的に例外を発生させる(通知する)操作 | throw new Error(...) |
料理で覚える覚え方
🍳 try = まず料理してみる
🧯 catch = 焦げたら消火する
🧹 finally = 成功でも失敗でも後片付けはする
📣 throw = 「焦げた!」と声を上げる
例外の種類
例外にはいくつかの分類があり、対応方針が変わります。
| 種類 | 内容 | 例 |
|---|---|---|
| チェック例外 | 発生を予測でき、対応を強制される | ファイルが見つからない、DB接続失敗 |
| 非チェック例外(実行時例外) | プログラムのバグが原因で発生 | ゼロ除算、NullPointerException |
| エラー | システムレベルの深刻な問題(原則対応不可) | メモリ不足、スタックオーバーフロー |
歴史と背景
- 1960年代 — PL/Iが初期のエラー処理機構を実装。「ON条件」という形でエラー時の動作を指定できた
- 1970年代 — CLUやAdaが「例外」という概念を言語仕様として整備。構造化エラー処理の原型が確立
- 1983年 — C++がtry/catch構文を導入。オブジェクト指向と例外処理の組み合わせが広まる
- 1990年代 — Java(1995年)がチェック例外とtry-catch-finallyを言語仕様に取り込み、例外処理を開発者の「義務」とするアプローチで普及を加速
- 2000年代以降 — Python・Ruby・C#・JavaScript など主要言語が標準機能として例外処理を装備。「例外処理なしのプログラム」はあり得ない時代に
- 現在 — マイクロサービス・クラウド環境では、例外処理に加えてサーキットブレーカー(連鎖障害を防ぐ仕組み)やリトライ設計との組み合わせが標準的に設計される
例外処理の実装パターンと注意点
実際のシステム開発では、例外処理の「どこで・どう捕まえるか」が品質を大きく左右します。
よくある悪いパターン(アンチパターン):
try {
危険な処理();
} catch (e) {
// 何もしない ← これが最悪!エラーが握りつぶされる
}
良いパターン:
try {
危険な処理();
} catch (e) {
ログ記録(e); ← 証拠を残す
ユーザーに通知(); ← 何が起きたか伝える
安全な状態に戻す(); ← データを守る
} finally {
リソースを解放(); ← ファイルやDB接続を閉じる
}
システム発注時に確認すべきポイント
発注側として、例外処理の設計について開発会社に確認しておくべき項目をまとめます。
| 確認項目 | 良い状態 | 危険なサイン |
|---|---|---|
| エラーログ | 日時・場所・内容が記録される | エラーが無言で消える |
| ユーザー通知 | 分かりやすいメッセージが出る | 真っ白な画面になる |
| データ整合性 | エラー時にロールバックされる | 途中まで保存されて壊れる |
| 監視・通知 | 重大エラーはアラートが飛ぶ | 気づかないまま放置される |
関連する規格・RFC
※ 例外処理はプログラミング言語レベルの概念であり、特定のRFC・ISO規格が直接定義するものではありませんが、関連する品質・信頼性規格として以下があります。
| 規格 | 内容 |
|---|---|
| ISO/IEC 25010 | ソフトウェア品質モデル。「信頼性」「障害許容性」を品質特性として定義しており、例外処理はその実装手段 |
| IEC 61508 | 機能安全規格。組み込み系・制御系ソフトウェアでの例外処理設計に関わる安全水準を定義 |