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 では、(または try-catch JScript のブロック) でエラーをOn Error Resume Next処理します。 または、インターネット インフォメーション サービス (IIS) を実行している場合は、 オブジェクトを ASPError 使用してカスタム エラー報告ページを作成します。 ただし、これらのアプローチには制限があります。

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

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

Page_Error イベントを使用する

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

注:

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

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

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

    1. Visual Studio .NET を開きます。
    2. ソリューション エクスプローラーで、プロジェクト ノードを右クリックし、[追加] をポイントし、[Web フォームの追加] をクリックします。
    3. [ 名前 ] テキスト ボックスに 「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. [ファイル] メニューの [保存] PageEvent.aspxをクリックします。

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

注:

コードが に対する呼び出し 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. [ファイル] メニューの [保存] AppEvent.aspxをクリックします。

  4. イベントを Application_ErrorGlobal.asax ファイルに追加して、AppEvent.aspx ページのイベントでPage_Loadスローしたエラーをトラップします。 イベント ログを Imports 使用するには、名前空間のステートメントを System.DiagnosticsGlobal.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 の [ ビルド ] メニューの [ ビルド] をクリックします。

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

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

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

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

    注:

    関連する 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 ページにリダイレクトされます。 セクションの属性の値で既定のエラー ページをdefaultRedirect<customErrors>参照することもできますが、発生した HTTP エラー コードに基づいてリダイレクト先の特定のページを指定することもできます。 子要素では <error> 、このオプションを使用できます。 例:

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

注:

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

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

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

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

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

トラブルシューティング

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

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

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

関連情報