2009年11月12日木曜日

ASP.NET ハンドルされなかった例外を処理する

Global.asaxファイル

Global.asaxファイルをアプリケーション・ルート直下に追加します。
Application_Errorイベントにハンドルされなかった例外を処理するコードを記述します。

<%@ Application Language="VB" %>

<script runat="server">

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' アプリケーションのスタートアップで実行するコードです
    End Sub
    
    Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
        ' アプリケーションのシャットダウンで実行するコードです
    End Sub
        
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        ' ハンドルされていないエラーが発生したときに実行するコードです
        
        'ログを出力します。
        Using writer As New System.IO.StreamWriter(Server.MapPath("~/MyError.log"), True)
            Dim err As Exception = Server.GetLastError.InnerException
            If err IsNot Nothing Then
                Dim text As New System.Text.StringBuilder
                text.Append(err.Source & Chr(13))
                text.Append(err.Message & Chr(13))
                text.Append(DateTime.Now.ToString & Chr(13))
                writer.WriteLine(text.ToString)
            End If
        End Using
        
        'カスタムエラーページを表示します。
        Server.Transfer("~/MyError.aspx")
    End Sub

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' 新規セッションを開始したときに実行するコードです
    End Sub

    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        ' セッションが終了したときに実行するコードです 
        ' メモ: Session_End イベントは、Web.config ファイル内で sessionstate モードが
        ' InProc に設定されているときのみ発生します。session モードが StateServer か、または 
        ' SQLServer に設定されている場合、イベントは発生しません。
    End Sub
       
</script>

カスタムエラーページを作成

ルート直下にMyError.aspxフォームを追加します。
今回はラベルを2つ配置し、Loadイベントで例外情報を出すようにしてみます。
Partial Class MyError
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
        Dim ex As Exception
        ex = Server.GetLastError
        If TypeOf ex Is HttpUnhandledException AndAlso ex.InnerException IsNot Nothing Then
            ex = ex.InnerException
        End If

        Me.Label1.Text = ex.GetType.ToString
        Me.Label2.Text = ex.Message

    End Sub
End Class

0 件のコメント: