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
従います。
プロジェクトに PageEvent.aspx という名前の新しいファイルを追加するには、次 の 手順に従います。
- Visual Studio .NET を開きます。
- ソリューション エクスプローラーで、プロジェクト ノードを右クリックし、[追加] をポイントし、[Web フォームの追加] をクリックします。
- [ 名前 ] テキスト ボックスに 「PageEvent.aspx」と入力し、[ 開く] をクリックします。
次のコードを 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>
[ファイル] メニューの [保存] PageEvent.aspxをクリックします。
ページを右クリックし、[ブラウザーで 表示 ] をクリックしてページを実行します。 エラーがスローされ、コード仕様に従って報告されていることに注意してください。
注:
コードが に対する呼び出し 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
示します。
AppEvent.aspxという名前 の 新しいファイルをプロジェクトに追加します。
次のコードを AppEvent.aspxに追加します。
<script language=vb runat="server"> Sub Page_Load(Sender as object, e as EventArgs) throw(new ArgumentNullException()) End Sub </script>
[ファイル] メニューの [保存] AppEvent.aspxをクリックします。
イベントを
Application_Error
Global.asax ファイルに追加して、AppEvent.aspx ページのイベントでPage_Load
スローしたエラーをトラップします。 イベント ログをImports
使用するには、名前空間のステートメントをSystem.Diagnostics
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
Global.asax ファイルを保存します。
Visual Studio .NET の [ ビルド ] メニューの [ ビルド] をクリックします。
ページを右クリックし、[ブラウザーで 表示 ] をクリックします。 この場合、ページは空白になりますが、新しいエントリがイベント ログに追加されていることがわかります。 このサンプルでは、イベント ビューアーからアクセスできるアプリケーション ログにエントリを作成します。 エラーをログに記録した後、ユーザーを別のわかりやすいエラー ページにリダイレクトしたり、必要に応じて追加のアクションを実行したりできます。
Web.config ファイルを使用する
または イベントでPage_Error
Application_Error
エラーを呼び出Server.ClearError
したりトラップしたりしない場合、エラーは Web.config ファイルのセクションの設定<customErrors>
に基づいて処理されます。 セクションでは、リダイレクト ページを既定の <customErrors>
エラー ページ () として指定するか、defaultRedirect
発生する Hypertext Transfer Protocol (HTTP) エラー コードに基づいて特定のページに指定できます。 このメソッドを使用して、ユーザーが受け取るエラー メッセージをカスタマイズできます。
アプリケーションの前のレベルでトラップされていないエラーが発生した場合、このカスタム ページが表示されます。 このセクションでは、 Global.asax ファイルを変更して、呼び出されないようにする Server.ClearError
方法を示します。 その結果、エラーは、エラーをトラップする最後のポイントとして 、Web.config ファイルで処理されます。
前の例の Global.asax ファイルを開きます。
行を
Server.ClearError
コメント アウトして、エラーが Web.config ファイルに表示されるようにします。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
セクションに次のコードを
<customErrors>
追加して、ユーザーをカスタム ページにリダイレクトします。<customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> </customErrors>
注:
関連する Web サーバーとアプリケーション名を参照するように、属性の
defaultRedirect
ファイル パスを変更する必要があります。このレベルでトラップされたエラーは既定のエラー ページに送信されるため、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>
コードをテストするには、ファイルを保存し、プロジェクトをビルドし、ブラウザーで 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>
設定されている属性が含まれていること mode
に On
注意してください。 属性は 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 という制限付きアカウントに設定されます。
この変更の詳細と、この記事のコードの実行に影響を与える方法、および追加のアクセス権が必要になる可能性があるその他のコードについては、パターン & プラクティスに関するページを参照してください。
関連情報
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示