はじめに

Pythonのtry-except構文は、エラーに対する堅牢性を実現する便利な手段である。
しかし、レビューアーの視点で見ると「例外処理がロジックそのものを隠してしまう設計」が頻繁に見受けられる。

特に、次のような構造はレビューで見逃してはならない。

  • except: pass によるエラー無視
  • 処理と例外補足が混在して意図が読めない
  • 例外の発生箇所が広範囲に及ぶ
  • 捕捉される例外種が不明瞭・過剰

レビューでは単なる構文誤用だけでなく、「構造として例外処理が正しい位置に置かれているか」を判断する必要がある。

悪い例:例外処理が処理ロジックを覆い隠しているケース

ロジックが隠蔽された例
def process_data(data):
    try:
        value = int(data["value"])
        result = compute(value)
        log_result(result)
    except:
        pass
Comment
@Reviewer: `except:`で全例外を無視しており、どの処理が失敗したかが不明です。最低限のログ出力と、例外ごとの補足を検討してください。

このようなコードは、実行時の異常を完全に黙殺するため、障害が発生しても発見が困難になる。

構造的改善:tryスコープの粒度とexceptの明示化

スコープを明確にした例
def process_data(data):
    try:
        value = int(data["value"])
    except (KeyError, ValueError) as e:
        logger.warning(f"Invalid data: {e}")
        return

    result = compute(value)
    log_result(result)

改善点:

  • 例外の発生可能箇所を最小限に限定
  • 捕捉する例外タイプを明示
  • ログ出力によって異常の検知が可能に

構造的に、通常処理と例外処理の境界が明確になり、責務が分離されている

処理と例外の境界

UML Diagram
UML Diagram

このようにtryのスコープと構造的境界を意識することで、処理の意図とエラー発生箇所が明示化される。

よくあるレビュー指摘ポイントと判断基準

構造上の問題例 指摘観点 提案内容
except: pass エラー無視。ログも出ず、障害検知不可能 最低限のlogger.warning()を追加すべき
広すぎるtryブロック どの行でエラーが出たか判断できない tryブロックを処理単位に絞る
except Exception 無差別捕捉。業務エラーとシステムエラーの混在 捕捉する例外クラスを限定する
複数の処理を1つのexceptで処理 処理と失敗時の因果関係が曖昧 ブロック分離・個別ログ出力を検討
except内でprintだけして終了 エラーが開発者にしか伝わらず運用視点がない ログレベル設定と出力先の構造を見直す

黙殺された例外処理の是正提案

例外処理に対するレビューやりとり
def save(user):
    try:
        db.insert(user)
        audit_log(user)
    except:
        pass
@Reviewer
すべての処理を無差別にtryで囲っており、ログも出力されていません。どの処理が失敗したのか判断できません。
@Developer
失敗しても致命的ではないので、無視してもよいかと…
@Reviewer
無視は問題を隠すだけです。最低限のエラーログと、どの操作に失敗したかが判る構造に分けるべきです。

リファクタ提案:tryの粒度と責務の明確化

明示的なログと分離構造による改善
def save(user):
    try:
        db.insert(user)
    except DBError as e:
        logger.error(f"Failed to insert user: {e}")
        return

    try:
        audit_log(user)
    except LogError as e:
        logger.warning(f"Audit log failed: {e}")

このように責務単位でtry-exceptを分けることで、障害の影響範囲が限定され、復旧や解析も容易になる

まとめ:レビューアーが例外処理を設計視点で見るために

例外処理は「発生したときの対応」ではなく、「どこまでを許容し、何を記録し、どう責務を切り出すか」という設計そのものである。

レビューアーは次の観点で例外構造を評価すべきである:

  • tryブロックの範囲が広すぎないか?
  • 捕捉すべき例外が明示されているか?
  • エラー時に記録・通知する仕組みが存在するか?
  • 通常処理と例外処理が混在しすぎていないか?

例外処理は“保険”ではなく“設計の一部”である。
それをどう構造として位置付けているかを読むことが、レビューアーの役割である。