Claude Codeで例外処理を改善する方法

Claude Codeで例外処理を改善する方法

Claude Codeを使うと、既存コードのエラー原因の調査、例外処理の追加、ログ設計、テスト作成まで効率よく進められます。この記事では、Claude Codeで例外処理を改善するための実践的な手順をまとめます。

Claude Codeで例外処理を改善する基本方針

例外処理を改善する目的は、単にエラーを握りつぶすことではありません。

重要なのは、エラーが発生したときに原因を特定しやすくし、ユーザーへの影響を最小限に抑え、再発防止につなげることです。

Claude Codeを使う場合は、最初に次のような方針を伝えると精度が上がります。

このプロジェクトの例外処理を改善してください。
目的は以下です。

・想定されるエラーを明確にする
・不要なtry-catchを減らす
・ログに原因調査しやすい情報を残す
・ユーザーに内部エラーの詳細を表示しない
・既存の動作を壊さない
・必要に応じてテストを追加する

Claude Codeには、単に「エラー処理を追加して」と依頼するよりも、改善目的を具体的に伝える方が効果的です。

まず現在の例外処理を調査する

いきなり修正を依頼する前に、現在のコードベースで例外処理がどのように書かれているかを確認します。

このリポジトリ内の例外処理を調査してください。
try-catch、throw、Promiseのcatch、エラーログ出力、独自例外クラスの使われ方を確認し、問題点を一覧化してください。
まだコードは変更しないでください。

このように依頼すると、Claude Codeは既存コードを読み取り、例外処理のばらつきや問題になりやすい箇所を整理しやすくなります。

特に確認したいポイントは以下です。

・catchしているのに何もしていない箇所
・console.logだけで済ませている箇所
・ユーザーにエラー詳細をそのまま返している箇所
・同じようなエラー処理が複数箇所に重複している箇所
・非同期処理のエラーが捕捉されていない箇所

握りつぶしているエラーを見直す

例外処理でよくある問題が、エラーをcatchしているのに何も処理しないパターンです。

try {
  await saveUser(user);
} catch (e) {
}

このようなコードは、障害が発生しても原因を追跡できません。

Claude Codeには次のように依頼します。

空のcatchブロックや、エラーを握りつぶしている処理を探してください。
必要なログ出力、再throw、ユーザー向けエラーメッセージへの変換を提案し、最小限の変更で修正してください。

改善後の例です。

try {
  await saveUser(user);
} catch (error) {
  logger.error("ユーザー保存に失敗しました", {
    userId: user.id,
    error,
  });

  throw new Error("ユーザー情報の保存に失敗しました。");
}

内部ログには調査に必要な情報を残し、外部に返すメッセージは安全で分かりやすい内容にします。

エラーの種類を分ける

すべての例外を同じように扱うと、適切な対応ができません。

たとえば、入力ミス、認証エラー、外部APIの障害、データベースエラーでは対応方法が異なります。

Claude Codeには次のように依頼できます。

この処理で発生しうるエラーを分類してください。
バリデーションエラー、認証エラー、権限エラー、外部APIエラー、DBエラー、想定外エラーに分けて、適切な例外処理に修正してください。

Node.jsやTypeScriptでは、独自エラークラスを作ると管理しやすくなります。

class AppError extends Error {
  constructor(
    message: string,
    public statusCode: number,
    public code: string
  ) {
    super(message);
  }
}

class ValidationError extends AppError {
  constructor(message: string) {
    super(message, 400, "VALIDATION_ERROR");
  }
}

エラーの種類を分けることで、APIレスポンスやログの扱いを統一できます。

非同期処理のエラー漏れを防ぐ

JavaScriptやTypeScriptでは、async/awaitやPromiseのエラー処理漏れが起きやすいです。

特に、awaitを書き忘れた処理や、Promiseのcatchがない処理は注意が必要です。

Claude Codeには次のように依頼します。

非同期処理の例外処理漏れを確認してください。
await漏れ、Promiseのcatch漏れ、Expressのasync handlerで捕捉されないエラーがないか確認し、必要な修正をしてください。

Expressの場合は、共通のasync handlerを用意すると管理しやすくなります。

const asyncHandler = (fn) => {
  return (req, res, next) => {
    Promise.resolve(fn(req, res, next)).catch(next);
  };
};

app.get("/users/:id", asyncHandler(async (req, res) => {
  const user = await getUser(req.params.id);
  res.json(user);
}));

このようにすると、各ルートで毎回try-catchを書く必要が減ります。

共通エラーハンドラーを整備する

API開発では、エラー処理を各処理に分散させるよりも、共通エラーハンドラーに集約した方が保守しやすくなります。

Claude Codeには次のように依頼できます。

API全体のエラーハンドリングを共通化してください。
各ルートで重複しているtry-catchを減らし、共通エラーハンドラーでレスポンス形式を統一してください。
既存のAPIレスポンス仕様は壊さないでください。

Expressの例です。

app.use((err, req, res, next) => {
  logger.error("APIエラーが発生しました", {
    path: req.path,
    method: req.method,
    error: err,
  });

  const statusCode = err.statusCode || 500;

  res.status(statusCode).json({
    success: false,
    error: {
      code: err.code || "INTERNAL_SERVER_ERROR",
      message: statusCode === 500
        ? "サーバーエラーが発生しました。"
        : err.message,
    },
  });
});

500エラーでは、内部情報をそのまま返さないことが重要です。

ログに残す情報を整理する

例外処理を改善するときは、ログ設計も重要です。

ログが少なすぎると原因調査が難しくなり、多すぎると個人情報や機密情報を残すリスクがあります。

Claude Codeには次のように依頼します。

エラーログの内容を見直してください。
原因調査に必要な情報は残しつつ、パスワード、トークン、個人情報などの機密情報を出力しないように修正してください。

ログに含めたい情報の例です。

・エラー発生箇所
・リクエストID
・ユーザーID
・処理対象のID
・HTTPメソッド
・URL
・外部API名
・ステータスコード
・スタックトレース

ログに含めない方がよい情報の例です。

・パスワード
・アクセストークン
・APIキー
・クレジットカード情報
・個人を特定できる詳細情報

ユーザー向けメッセージを安全にする

例外メッセージをそのまま画面やAPIレスポンスに出すと、内部構造やセキュリティ上の情報が漏れる可能性があります。

悪い例です。

res.status(500).json({
  error: error.message
});

データベース名、SQL、ファイルパスなどが表示される可能性があります。

改善例です。

res.status(500).json({
  error: {
    code: "INTERNAL_SERVER_ERROR",
    message: "処理中にエラーが発生しました。時間をおいて再度お試しください。"
  }
});

Claude Codeには次のように依頼するとよいです。

ユーザーに返しているエラーメッセージを確認してください。
内部エラーの詳細、SQL、スタックトレース、ファイルパス、外部APIの詳細レスポンスを返している箇所があれば、安全なメッセージに変更してください。

テストで例外処理を確認する

例外処理を変更したら、正常系だけでなく異常系のテストも必要です。

Claude Codeには次のように依頼します。

今回変更した例外処理に対してテストを追加してください。
正常系、バリデーションエラー、外部API失敗、DBエラー、想定外エラーのケースを確認してください。

Jestの例です。

it("ユーザー保存に失敗した場合はエラーレスポンスを返す", async () => {
  saveUserMock.mockRejectedValue(new Error("DB connection failed"));

  const response = await request(app)
    .post("/users")
    .send({ name: "test" });

  expect(response.status).toBe(500);
  expect(response.body.error.code).toBe("INTERNAL_SERVER_ERROR");
  expect(response.body.error.message).toBe("サーバーエラーが発生しました。");
});

異常系テストを追加しておくと、将来の修正で例外処理が壊れるリスクを減らせます。

Claude Codeに依頼するときの実用プロンプト

例外処理の改善では、Claude Codeに一度で大きな変更をさせるより、段階的に依頼するのがおすすめです。

調査用プロンプトです。

このプロジェクトの例外処理を調査してください。
問題のある箇所をファイル名、行付近、問題内容、改善案の形式で一覧化してください。
まだ修正はしないでください。

修正用プロンプトです。

先ほど見つけた問題のうち、影響範囲が小さいものから順に修正してください。
既存仕様を変えず、エラー処理、ログ、レスポンス形式を改善してください。
変更後にテストも追加してください。

レビュー用プロンプトです。

今回の変更をレビューしてください。
例外の握りつぶし、過剰なtry-catch、ログの機密情報、ユーザー向けメッセージ、テスト不足がないか確認してください。

コミット前確認用プロンプトです。

例外処理改善の変更差分を確認してください。
本番環境で問題になりそうな点、破壊的変更、レスポンス形式の変更、ログ出力のリスクがないか確認してください。

まとめ

Claude Codeで例外処理を改善するには、まず現状を調査し、問題点を整理してから段階的に修正することが大切です。

特に、空のcatch、非同期処理のエラー漏れ、内部情報を含むエラーレスポンス、ログ不足、異常系テスト不足は優先して見直すべきポイントです。

Claude Codeには、目的、制約、確認してほしい観点を具体的に伝えることで、実用的な改善案を得やすくなります。

例外処理はアプリケーションの信頼性に直結します。Claude Codeを活用して、エラーが起きても原因を追跡しやすく、ユーザーに安全で分かりやすい動作を返せるコードに整えていきましょう。