はじめに:なぜ“例外処理”を軽視すると危険なのか?
多くの開発者が、例外処理を「とりあえず try-catch
しておけばOK」と考えがちです。しかし、適切に設計されていない例外処理は、障害の温床になります。
- ログに残らないエラー
- ユーザーに不適切なフィードバック
- 原因不明のシステム停止
本記事では、PythonとJavaでの実践的な例外処理の書き方・考え方・共通パターンを解説します。
基本:PythonとJavaの例外処理の書き方
Pythonの例
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"エラー発生: {e}")
finally:
print("終了処理")
except
でエラーごとの処理を分けるfinally
で必ず行う処理(DB接続のcloseなど)
Javaの例
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("エラー発生: " + e.getMessage());
} finally {
System.out.println("終了処理");
}
throws
宣言とtry-catch
の使い分け- チェック例外と非チェック例外の違いを理解することが重要
実務で役立つ例外処理テクニック集
1. ログ出力は“情報の粒度”を意識する
❌やりがち
except Exception:
print("何かエラーが発生しました")
✅改善例(Python)
import logging
try:
# 何らかの処理
except Exception as e:
logging.exception("処理中にエラーが発生しました")
✅改善例(Java)
catch (Exception e) {
logger.error("処理中にエラー", e);
}
🔍 ポイント:ログには「いつ」「何が」「どこで」起きたかを出す。ログレベル(INFO / WARN / ERROR)を使い分ける。
2. 意図的な例外送出(raise/throw)でバグの早期発見
Python例
def set_age(age):
if age < 0:
raise ValueError("年齢は0以上である必要があります")
Java例
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年齢は0以上である必要があります");
}
}
✅「正常系に見えるけど不正なデータ」を例外で弾くことは、実務の堅牢性を上げる鉄則。
3. 「握りつぶし」は厳禁。例外の“握り直し”を活用しよう
❌やってはいけない(握りつぶし)
try:
some_process()
except Exception:
pass
✅やるべき(握り直し)
try:
some_process()
except SomeSpecificError as e:
raise RuntimeError("業務処理中の例外") from e
Javaの握り直し(ラップ)
try {
doSomething();
} catch (IOException e) {
throw new RuntimeException("ファイル処理中のエラー", e);
}
💡 握り直すことで「エラーの文脈」を追加できる。
4. 複数層での例外処理設計を意識する(アーキテクチャ設計)
例:業務アプリケーションにおける構造
層 | 処理 | 例外処理 |
---|---|---|
UI層 | エラーメッセージ表示 | ユーザー向けの例外に変換 |
サービス層 | 業務処理 | ロギング+握り直し |
リポジトリ層 | DB接続 | DB系例外を抽象化して送出 |
5. 「例外を投げることが正義」ではない|リトライ・フォールバックも設計のうち
Pythonでのリトライ例
import time
for _ in range(3):
try:
call_api()
break
except TimeoutError:
time.sleep(1)
else:
raise RuntimeError("APIが3回失敗しました")
Javaでのフォールバック例
try {
return callPrimary();
} catch (ServiceUnavailableException e) {
return callFallback();
}
☑ リトライ、フォールバック、代替手段の用意も、例外処理の延長線上。
まとめ:例外処理は“保険”ではなく“設計”である
例外処理を適当に書いてしまうと、障害調査のたびに苦労します。逆に、例外処理を丁寧に設計することで、以下のような効果が期待できます。
- 異常の早期検出と通知
- 原因特定の迅速化
- ユーザー体験の安定化
- 開発者間の連携しやすさ向上