📖

ASP.NET Coreのエラーハンドリング:専用コントローラーvs既存コントローラー

2025/01/17に公開

ASP.NET Coreアプリケーションでエラーハンドリングを実装する際、多くの開発者が直面する選択肢の一つが、エラーページの表示方法です。主に以下の2つのアプローチがあります

  1. 専用のErrorコントローラーを作成する
  2. 既存のHomeコントローラーにErrorアクションを追加する

それぞれのアプローチにはメリット・デメリットがありますので、詳しく見ていきましょう。

専用のErrorコントローラーを使用する場合

メリット

  • 関心の分離: エラーハンドリングのロジックが独立したコントローラーに分離されるため、コードの管理が容易になります。
  • 拡張性: エラー処理に特化したコントローラーを持つことで、将来的なエラーハンドリングの拡張が容易になります。
  • 明確な責任: エラーハンドリングに関連する全ての機能が一つの場所に集約されるため、コードの意図が明確になります。

デメリット

  • 追加のコントローラーファイルが必要
    管理するファイルが増えるため、最終的なメンテナンスコストが増加します。

  • プロジェクト構造が若干複雑になる可能性がある

Homeコントローラーに統合する場合

メリット

  • シンプルさ: 既存のコントローラーを活用するため、プロジェクト構造がシンプルになります。
  • 素早い実装: 既存のコントローラーに単純にアクションを追加するだけで済むため、実装が速い。

デメリット

  • Homeコントローラーの責任範囲が広くなりすぎる
  • エラーハンドリングの拡張時に、Homeコントローラーが肥大化する可能性がある
    「後の改善項目」にしておいて、まずはHomeコントローラーに実装する方針はよくあります。YAGNIに則り、必要になったら作るスタンスでも良いと思います。ただし、チームの文化など考慮してください。
YAGNI

「それが実際に必要になったときに実装するべきあって、必要になると予見したときに実装するべきでない」
https://ja.wikipedia.org/wiki/YAGNI

推奨されるアプローチ

結論として、専用のErrorコントローラーを作成するアプローチを推奨かなと思います。
小さい規模だったとしても専用コントローラになると責任が明確化され、ファイルの数こそ増えますが、その場しのぎ感も少なく結果的に良い結果に至りやすいのではないでしょうか。

  1. 保守性の向上
    エラーハンドリングは時間とともに複雑になる傾向があり、独立したコントローラーで管理することで、変更の影響範囲を限定できます。

  2. テスタビリティの向上
    エラーハンドリングに特化したユニットテストの作成が容易になります。

  3. スケーラビリティ
    将来的な要件変更(例:エラーログの追加、カスタムエラーページの実装など)に柔軟に対応できます。

実装例

// エラーコントローラーの実装例
public class ErrorController : Controller
{
    // 一般的なエラーハンドリング
    public IActionResult Index()
    {
        return View();
    }

    // 404エラーハンドリング
    public IActionResult NotFound()
    {
        return View();
    }

    // カスタムエラーハンドリング
    public IActionResult CustomError(string errorMessage)
    {
        ViewBag.ErrorMessage = errorMessage;
        return View();
    }
}

まとめ

エラーハンドリングは、アプリケーションの重要な側面の一つです。専用のErrorコントローラーを使用することで、より整理された、保守性の高いコードベースを維持することができます。特に中規模以上のプロジェクトでは、このアプローチが長期的なメンテナンス性と拡張性の観点から優れています。

とはいえ、小規模なアプリや小さい要件の場合には既存コントローラーの拡張で十分です。実装する対象を見極めて使い分けてみてください。

Discussion