[ ASP.NET ] Application_Error に例外処理を集約する( Global.aspx )

Pocket

ここでは、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 と同じです。

参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *