ここでは、ASP.NET で発生したエラーを Application_Error イベントに集約して処理を行うサンプルを掲載しています。ログの出力処理などの利用シーンが考えられます。
スポンサーリンク
グローバルアプリケーションクラス ( Application_Error )
Application_Error イベントに集約されますので、このイベントハンドラにエラー処理を記述します。Web アプリプロジェクト内にグローバールアプリケーションクラス ( Global.aspx ) がない場合は追加します。ソリューションエクスプローラでプロジェクトを右クリックし、[ 追加 ] ― [ 新しい項目 ] からグローバルアプリケーションクラス ( Global.aspx ) を選択すると追加されます。
作成された Global.aspx ファイルにはいくつかのイベントが作成されていますが、その中の Application_Error イベントにアプリケーション内のエラーが集約されます。Application_Error イベント内の実装例のサンプルは下記のようなものになります。
VB.NET
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) ' エラーの発生時に呼び出されます。 Dim message As StringBuilder = New StringBuilder() If (Server IsNot Nothing) Then ' 例外の内容を取得し、StringBuilder に格納する Dim ex As Exception = Server.GetLastError() While ex IsNot Nothing message.AppendFormat("{0}: {1}{2}", ex.GetType().FullName, ex.Message, ex.StackTrace) ex = ex.InnerException End While ' ' 例外情報と内部例外情報をログとして出力する処理など ' ' 例外をクリア(カスタムエラーページを設定している場合はコメントアウトすること) Server.ClearError() End If End Sub
C#
protected void Application_Error(object sender, EventArgs e) { ' 例外の内容を取得し、StringBuilder に格納する StringBuilder message = new StringBuilder(); if (Server != null) { Exception ex; // 例外情報を取得する for (ex = Server.GetLastError(); ex != null; ex = ex.InnerException) { message.AppendFormat("{0}: {1}{2}", ex.GetType().FullName, ex.Message, ex.StackTrace); } // // 例外情報と内部例外情報をログとして出力する処理など // // 例外をクリア(カスタムエラーページを設定している場合はコメントアウトすること) Server.ClearError(); } }
カスタムエラーページを使用している場合の注意事項
ASP.NET では、カスタムエラーページの機能を利用して、例外発生時にそのページを表示させるようにすることができます。下記の web.config 設定の場合には、例外発生時に ErrorPage.html がレスポンスとしてブラウザに返されるようになります。
web.config カスタムエラーページの設定例
<?xml version="1.0"?> <configuration> <system.web> <customErrors defaultRedirect="ErrorPage.html" mode="On"/> </system.web> </configuration>
カスタムエラーページを設定している場合、上記の Application_Error イベントの実装例では、Server.ClearError メソッドによってエラー情報をクリアしているためカスタムエラーページの設定が無効となってしまいます。共存させるにはエラー情報のクリア処理をコメントアウトします。
ページ単位でエラー処理を集約する
アプリケーション全体でエラーを集約するのではなく、ページ単位でエラーを集約させるには、各ページで Page_Error イベントを実装します。例外の取得方法は、ここで示した Application_Error と同じです。
参考
- Visual C# .NET を使用して ASP.NET のカスタム エラー報告ページを作成する方法
- HttpServerUtility.ClearError メソッド
- customErrors 要素 (ASP.NET 設定スキーマ)
- Visual Basic .NET を使用して ASP.NET のカスタム エラー報告ページを作成する方法