C# ASP.NET Web APIで未処理の例外を処理する例外フィルターの作成方法
例外フィルターとは?
ASP.NET Web APIでは、コントローラーのアクションメソッド内で発生した未処理の例外に対して、例外フィルター(Exception Filter)を使って共通のエラー処理を行うことができます。ただし、HttpResponseExceptionだけは例外的な存在です。これはHTTPレスポンスを返すことを目的として特別に設計された型のため、例外フィルターの処理対象にはなりません。
例外フィルターの基本的な作成方法
例外フィルターを実装するには、System.Web.Http.Filters.IExceptionFilterインターフェースを実装します。しかし、実際の開発では、このインターフェースがすでに実装されているSystem.Web.Http.Filters.ExceptionFilterAttributeクラスを継承し、OnExceptionメソッドをオーバーライドするのが最も簡単で一般的な方法です。
以下は、NotFiniteNumberException例外をHTTPステータスコード416(Requested Range Not Satisfiable:要求された範囲は満たせません)に変換するカスタム例外フィルターのサンプルです。
例外フィルター(ExceptionAttribute)の実装例
using System;
using System.Net;
using System.Net.Http;
using System.Web.Http.Filters;
namespace DemoWebApplication.Controllers{
public class ExceptionAttribute : ExceptionFilterAttribute{
public override void OnException(HttpActionExecutedContext context){
if (context.Exception is NotFiniteNumberException){
context.Response = new HttpResponseMessage(HttpStatusCode.RequestedRangeNotSatisfiable);
}
}
}
}
コントローラーのアクションメソッドの実装例
using DemoWebApplication.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
[Exception]
public class StudentController : ApiController{
List<Student> students = new List<Student>{
new Student{
Id = 1,
Name = "Mark"
},
new Student{
Id = 2,
Name = "John"
}
};
public Student Get(int id){
if(id <= 0){
throw new NotFiniteNumberException("The Id is not valid");
}
var studentForId = students.FirstOrDefault(x => x.Id == id);
return studentForId;
}
}
}
それでは、上記のExceptionAttributeの動作を確認してみましょう。アクションメソッドに対してid = 0を渡してリクエストを送信すると、NotFiniteNumberExceptionがスローされ、例外フィルターによってHTTPステータス416が返されます。

例外フィルターの登録方法
作成した例外フィルターは、以下の3つの方法のいずれかで登録できます。
1. アクションメソッドに適用する
特定のアクションメソッドにのみ例外処理を適用したい場合は、メソッド単位で属性を付与します。
[Exception]
public IHttpActionResult Get(int id){
return Ok();
}
2. コントローラークラスに適用する
コントローラー全体のすべてのアクションメソッドに適用したい場合は、クラス単位で属性を付与します。
[Exception]
public class StudentController : ApiController{
public IHttpActionResult Get(int id){
return Ok();
}
}
3. WebApiConfig.csでグローバルに登録する
アプリケーション全体に適用したい場合は、WebApiConfig.csでグローバルフィルターとして登録します。
public static class WebApiConfig{
public static void Register(HttpConfiguration config){
config.Filters.Add(new ExceptionAttribute());
}
}グローバルに登録すれば、すべてのコントローラーやアクションメソッドに自動的に適用されるため、アプリケーション全体で統一された例外処理ポリシーを実現できます。適用範囲に応じて、これら3つの方法を使い分けるのがおすすめです。
-
C# ASP.NET WebAPIでCORSの問題を解決する方法を徹底解説
CORS(クロスオリジンリソースシェアリング)とはクロスオリジンリソースシェアリング(Cross-Origin Resource Sharing:CORS)は、追加のHTTPヘッダーを使用して、あるオリジンで動作しているWebアプリケーションに対し、別のオリジンにある選択されたリソースへのアクセスを許可するようブラウザに指示する仕組みです。Webアプリケーションは、自身とは異なるオリジン(ドメイン、プロトコル、ポート)のリソースを要求する際に、クロスオリジンHTTPリクエストを実行します。例として、フロントエンド(UI)とバックエンド(サービス)を持つアプリケーションを考えてみましょう。フロン
-
JavaでJTableをフィルタリングする方法!TableRowSorterとsetRowFilter()の使い方を解説
JTableは、テーブルを柔軟に作成・表示できるSwingのコンポーネントです。テーブルの内容を扱うためのメソッドはTableModelインターフェースで定義されており、実際にはAbstractTableModelクラスを継承して独自のテーブルモデルを実装するのが一般的です。また、JTableではsetCellEditor()メソッドにTableCellEditorインターフェースの実装オブジェクトを渡すことで、セルの編集機能を追加することもできます。 テーブルの表示内容をフィルタリング(絞り込み)するには、TableRowSorterクラスのsetRowFilter()メソッドを使用します。