Visual Basic .NET を使用して ASP.NET でカスタム エラー報告ページを作成する

この記事では、Microsoft Visual Basic .NET コードを使用して、ASP.NET で発生したエラーをトラップして対応する方法について説明します。

元の製品バージョン: Visual Basic .NET、ASP.NET
元の KB 番号: 308132

まとめ

ASP.NET により、従来の Active Server Pages (ASP) からのエラー処理オプションが改善されました。 ASP.NET では、アプリケーション内のいくつかの異なるレベルでエラーを処理できます。

ASP.NET の新機能

ASP.NET では、エラーを処理して対応する方法についていくつかの進歩が提供されています。 従来の ASP では、 On Error Resume Next (または JScript の try-catch ブロック) でエラーを処理します。 または、インターネット インフォメーション サービス (IIS) を実行している場合は、ASPError オブジェクトを使用してカスタム エラー報告ページを作成します。 ただし、これらのアプローチには制限があります。

ASP.NET には、ASP.NET アプリケーションの実行時に発生する可能性があるエラーを処理して対応できるいくつかのレベルが用意されています。 ASP.NET には、エラーが発生したときにトラップして応答できる 3 つの主要な方法 ( Page_Error イベント、 Application_Error イベント、アプリケーション構成ファイル (Web.config) が用意されています。

この記事では、ASP.NET アプリケーションでこれらの新機能を使用する方法について説明します。 この記事では、カスタム エラー ページと、ASP.NET に直接関連する一般的なエラー報告を提供する方法について説明しますが、この記事では、 try-catch-finally ブロックや共通言語ランタイム (CLR) 例外システムなどの他のエラー処理方法については説明しません。

Page_Error イベントを使用する

Page_Error イベントは、ページ レベルで発生したエラーをトラップする方法を提供します。 (従うサンプル コードのように) エラー情報を表示したり、イベントをログに記録したり、他のアクションを実行したりできます。

Note

次の使用例は、デモンストレーション目的でのみ、ブラウザーに詳細なエラー情報を表示します。 アプリケーションのエンド ユーザーに詳細情報を表示する場合は、特にアプリケーションがインターネット上で実行されている場合は注意が必要です。 より適切なアクションは、エラーが発生したことをユーザーに通知するメッセージを表示し、実際にイベント ログに特定のエラーの詳細を記録することです。

この例では null 例外をスローします。これにより、 Page_Load イベントでエラーが強制的に発生します。 Page_Error イベントをテストする初期ページを作成するには、次の手順に従います。

  1. PageEvent.aspxという名前の新しいファイルをプロジェクトに追加するには、次の手順に従います。

    1. Visual Studio .NET を開きます。
    2. ソリューション エクスプローラーで、プロジェクト ノードを右クリックし、Add をポイントして、[Web フォームの追加] をクリック
    3. Name テキスト ボックスに「PageEvent.aspx」と入力し、[開く] をクリック
  2. 次のコードを PageEvent.aspxに追加します。

    <%@ Page Language="vb"%>
    <script runat=server>
        Sub Page_Load(Sender as object, e as EventArgs)
           throw(new System.ArgumentNullException())
        End Sub
        Sub Page_Error(Sender as object, e as EventArgs)
           Dim objErr as Exception = Server.GetLastError().GetBaseException()
           Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _
                               "<br><b>Error in: </b>" & Request.Url.ToString() & _
                               "<br><b>Error Message: </b>" & objErr.Message.ToString() & _
                               "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString()
           Response.Write(err.ToString())
           Server.ClearError()
        End Sub
    </script>
    
  3. File メニューの Save PageEvent.aspx をクリックします。

  4. ページを右クリックし、ブラウザーで View をクリックしてページを実行します。 エラーがスローされ、コードの仕様に従って報告されていることに注意してください。

Note

コードが Server.ClearErrorの呼び出しを発行していることに気付く場合があります。 これにより、エラーが処理される Application_Error イベントに進むのを防ぐことができます。

Application_Error イベントを使用する

Page_Error イベントと同様に、Application_Error イベントを使用して、アプリケーションで発生するエラーをトラップできます。 イベントのアプリケーション全体のスコープにより、アプリケーション エラー情報をログに記録したり、発生する可能性のある他のアプリケーション レベルのエラーを処理したりできます。

次のサンプルは、上記の Page_Error イベント コード サンプルに基づいており、 Page_Load イベントのエラーが Page_Error イベントにトラップされなかった場合に発生します。 Application_Error イベントは、アプリケーションの Global.asax ファイルで指定されます。 わかりやすくするために、このセクションの手順では、例外をスローする新しいページを作成し、Global.asax ファイルのApplication_Error イベントでエラーをトラップし、エラーをイベント ログに書き込みます。 次の手順では、 Application_Error イベントの使用方法を示します。

  1. AppEvent.aspxという名前の新しいファイルをプロジェクトに追加します。

  2. 次のコードを AppEvent.aspxに追加します。

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. File メニューの Save AppEvent.aspx をクリックします。

  4. Application_Error イベントを Global.asax ファイルに追加して、AppEvent.aspx ページのPage_Load イベントでスローしたエラーをトラップします。 イベント ログを使用するには、System.Diagnostics名前空間のImports ステートメントを Global.asax に追加する必要があることに注意してください。

    Global.asax ファイルに次のコードを追加します。

    Imports System.Diagnostics
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim objErr As Exception = Server.GetLastError().GetBaseException()
        Dim err As String = "Error Caught in Application_Error event" & _
                                System.Environment.NewLine & _
                                "Error in: " & Request.Url.ToString() & _
                                System.Environment.NewLine & _
                                "Error Message: " & objErr.Message.ToString() & _
                                System.Environment.NewLine & _
                                "Stack Trace:" & objErr.StackTrace.ToString()
        EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
        Server.ClearError()
        additional actions...
    End Sub
    
  5. Global.asax ファイルを保存します。

  6. Visual Studio .NET の Build メニューの [ Build をクリックします。

  7. ページを右クリックし、ブラウザーで View をクリックします。 この場合、ページは空白になりますが、イベント ログに新しいエントリが追加されていることがわかります。 このサンプルでは、イベント ビューアーからアクセスできるアプリケーション ログにエントリを作成します。 エラーをログに記録した後、ユーザーを別のわかりやすいエラー ページにリダイレクトしたり、必要に応じて追加のアクションを実行したりできます。

Web.config ファイルを使用する

Server.ClearErrorを呼び出したり、Page_ErrorまたはApplication_Errorイベントのエラーをトラップしたりしない場合、エラーは Web.config ファイルの <customErrors> セクションの設定に基づいて処理されます。 <customErrors>セクションでは、リダイレクト ページを既定のエラー ページ (defaultRedirect) として指定したり、発生するハイパーテキスト転送プロトコル (HTTP) エラー コードに基づいて特定のページに指定したりできます。 このメソッドを使用すると、ユーザーが受け取るエラー メッセージをカスタマイズできます。

アプリケーションの前のレベルでトラップされていないエラーが発生した場合、このカスタム ページが表示されます。 このセクションでは、Server.ClearErrorが呼び出されないように Global.asax ファイルを変更する方法について説明します。 その結果、エラーをトラップする最後のポイントとして、 Web.config ファイルでエラーが処理されます。

  1. 前の例の Global.asax ファイルを開きます。

  2. Server.ClearError行をコメント アウトして、エラーが Web.config ファイルに確実に表示されるようにします。

  3. 変更を Global.asax に保存します。 これで、コードは次のように表示されます。

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim objErr As Exception = Server.GetLastError().GetBaseException()
         Dim err As String = "Error Caught in Application_Error event" & _
                             System.Environment.NewLine & _
                             "Error in: " & Request.Url.ToString() & _
                             System.Environment.NewLine & _
                             "Error Message: " & objErr.Message.ToString() & _
                             System.Environment.NewLine & _
                             "Stack Trace:" & objErr.StackTrace.ToString()
         EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
         Server.ClearError()
         additional actions...
     End Sub
    
  4. 次のコードを <customErrors> セクションに追加して、ユーザーをカスタム ページにリダイレクトします。

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    Note

    関連する Web サーバーとアプリケーション名を参照するように、 defaultRedirect 属性のファイル パスを変更する必要があります。

  5. このレベルでトラップされたエラーは既定のエラー ページに送信されるため、 ErrorStatus.htmという名前のエラー ページを作成する必要があります。 この例では、エラー ページに .htm ページを使用するため、このメソッドを使用してユーザーに表示される内容を制御していることを覚えておいてください。 次のコードを ErrorStatus.htmに追加します。

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. コードをテストするには、ファイルを保存し、プロジェクトをビルドして、ブラウザーで AppEvent.aspx を表示します。 エラーがスローされると、 ErrorStatus.htm ページにリダイレクトされます。 <customErrors> セクションの defaultRedirect 属性の値で既定のエラー ページを参照できますが、発生する HTTP エラー コードに基づいてリダイレクトする特定のページを指定することもできます。 <error>子要素では、このオプションを使用できます。 例えば次が挙げられます。

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

Note

<customErrors> セクションのdefaultRedirectで指定されているページは、.htm ファイルです。 .aspx ページでGetLastErrorを使用する場合 (Page_ErrorApplication_Errorのサンプルで行います)、リダイレクトが行われる前に、セッション変数またはその他の方法に例外を格納する必要があります。

<customErrors> セクションには、On に設定されたmode属性が含まれていることに注意してください。 mode属性は、エラー リダイレクトの実行方法を制御するために使用されます。 たとえば、アプリケーションを開発している場合、実際の ASP.NET エラー メッセージを表示し、よりわかりやすいエラー ページにリダイレクトしたくない場合が最も多くなります。 mode属性には、次の設定が含まれています。

  • On: ハンドルされない例外は、指定された defaultRedirect ページにユーザーをリダイレクトします。 この mode は、主に運用環境で使用されます。

  • Off: ユーザーは例外情報を受け取り、 defaultRedirect ページにリダイレクトされません。 この mode は主に開発に使用されます。

  • RemoteOnly: (localhost を使用して) ローカル コンピューター上のサイトにアクセスするユーザーのみが例外情報を受け取ります。 他のすべてのユーザーは、 defaultRedirect ページにリダイレクトされます。 このモードは、主にデバッグに使用されます。

トラブルシューティング

Windows での既定のインストールでは、ASP.NET はワーカー プロセスで Web アプリケーション コードを実行します。 このプロセスの ID は、既定では、 ASPNET アカウントと呼ばれる特権のないローカル アカウントになります。 ASP.NET のベータ リリースでは、プロセス ID は System でした。これは、マシンに対する多くの特権を持つ強力な管理アカウントでした。

Windows Server (IIS) での既定のインストールでは、ASP.NET はワーカー プロセスで Web アプリケーション コードを実行します。 このプロセスの ID は、既定で NetworkService という制限付きアカウントに設定されます。

この変更の詳細と、この記事のコードの実行に及ぼす影響、および追加のアクセス権が必要になる可能性があるその他のコードについては、 パターンとプラクティスに関する記事を参照してください。

関連情報