【意外とやってない】Python・Javaの「例外処理」を実務で使いこなすテクニック集

はじめに:なぜ“例外処理”を軽視すると危険なのか?

多くの開発者が、例外処理を「とりあえず 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();
}

リトライ、フォールバック、代替手段の用意も、例外処理の延長線上。


まとめ:例外処理は“保険”ではなく“設計”である

例外処理を適当に書いてしまうと、障害調査のたびに苦労します。逆に、例外処理を丁寧に設計することで、以下のような効果が期待できます。

  • 異常の早期検出と通知
  • 原因特定の迅速化
  • ユーザー体験の安定化
  • 開発者間の連携しやすさ向上

おすすめ関連記事

タイトルとURLをコピーしました