| デベロッパー | 2007年1月9日 10:00 |
|
処理の例外への適切な対処法2:例外の詳細を開発者に通知する 著者: Scott Mitchell オリジナル版を読む ▼2007年1月9日 10:00 付の記事 ■海外internet.com発の記事 はじめにASP.NETアプリケーションで未処理の例外が発生すると、既定では訪問者に「ランタイムエラー」ページまたは例外の詳細ページが表示されます(どちらのページが表示されるかは、Webサイトの設定および訪問者がローカルホストから表示しているかどうかによります)。理想的なことを言えば、このような難解なエラーページは開発者だけに表示され、通常のユーザーにはユーザーフレンドリなカスタムエラーページが表示されるべきでしょう。前回の記事「未処理の例外への適切な対処法」では、未処理の例外への応答としてユーザーフレンドリなカスタムWebエラーページを表示するASP.NET Webアプリケーションの設定方法を紹介しました。 ただし、前回の記事で紹介した方法では、未処理の例外が発生したときに内部的に 未処理の例外がASP.NETランタイムに通知されると、アプリケーションレベルの この記事では、 Errorイベントを調べる 未処理の例外が発生した場合、通常は次のいずれかを行います。
(「未処理の例外への適切な対処法」を参照)。
この場合は、後で調査できるようにエラーを記録したり、電子メールを送ってエラーを開発者に通知したり、問題の「修正」を試みたりする必要があるかもしれません。
エラーを「処理」するには、まずアプリケーションの Global.asaxでErrorイベントハンドラを作成する 「Global.asax」は、Webアプリケーションのルートディレクトリに追加できるオプションのファイルで、このファイルを使用してアプリケーションレベルおよびセッションレベルのイベントを処理することができます。アプリケーションの これにより、メインアプリケーションレベルのイベント( HttpContext.Current.Server.GetLastError() このメソッドから返される 未処理の例外が発生したときには、電子メールで開発者に例外の詳細を知らせると共に、前回の記事「未処理の例外への適切な対処法」で説明したように、ユーザーをカスタムエラーページにリダイレクトするものとしましょう。これを行うためには、「Web.config」内で Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) ’Get exception details Dim ex As Exception = HttpContext.Current.Server.GetLastError() If TypeOf ex Is HttpUnhandledException AndAlso _ ex.InnerException IsNot Nothing Then ex = ex.InnerException End If If ex IsNot Nothing Then Try ’Email the administrator with information ’that an error has occurred ’!!! UPDATE THIS VALUE TO YOUR EMAIL ADDRESS Const ToAndFromAddress As String = "’email address’" ’(1) Create the MailMessage instance Dim mm As New System.Net.Mail.MailMessage(ToAndFromAddress, _ ToAndFromAddress) ’(2) Assign the MailMessage’s properties mm.Subject = "An unhandled exception occurred!" mm.Body = String.Format( _ "An unhandled exception occurred:{0}Message: {1}{0}{0} Stack Trace:{0}{2}", _ System.Environment.NewLine, ex.Message, ex.StackTrace) mm.IsBodyHtml = False ’(3) Create the SmtpClient object Dim smtp As New System.Net.Mail.SmtpClient ’(4) Send the MailMessage (will use the Web.config settings) smtp.Send(mm) Catch ’Whoops, some problem sending email! ’Just send the user onto CustomErrorPage.aspx... End Try End If End Sub イベントハンドラの最初の数行に特に注意を払ってください。発生した例外にアクセスし( ユーザーがデータ駆動型のページを訪れ、データベースに接続する際に問題があったします。このとき、ユーザーには設定されているエラーページが表示されますが、開発者には例外の詳細を記した電子メールが送られます。 リダイレクトではなく制御をカスタムエラーページに移す 前回の記事「未処理の例外への適切な対処法」で説明したように、「Web.config」の しかし、カスタムエラーページでエラーに関する情報を保持したいこともあります。おそらく、発生したエラーに応じたメッセージを表示したり、特定の役割を持つ認証された訪問者に例外の詳細を表示したいことがあるでしょう。これは Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) ’... Email details of exception to developer ... Server.Transfer("~/SmartCustomErrorPage.aspx") End Sub この記事のダウンロードサンプルを使用すると、もっと高度なカスタムエラーページ(SmartCustomErrorPage.aspx)を表示できます。このエラーページは例外の詳細を調べて、発生した例外のタイプに応じてメッセージを組み立てます。 HTTPモジュールでErrorイベントを処理する HTTPモジュールは、ASP.NETランタイムが発生させたイベントに応答できるマネージドコンポーネントです。代わりに、 エラー処理のためにHTTPモジュールを作成し設定するのは本稿の守備範囲を超えるので、ここで説明することはできません。代わりに、Atif Azizが提供しているフリーなオープンソースライブラリ、ELMAH(Error Logging Modules And Handlers)をお勧めします。ELMAHは、未処理の例外をデータストアに記録するためのHTTPモジュールと、例外の詳細をWebページまたはRSSフィードに表示するためのHTTPハンドラから成ります。 ELMAHは、GotDotNet Workspaceからダウンロードできます。ELMAHのセットアップとインストールの詳細については、「Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components」を参照してください。ELMAHのセットアップに要する時間は60秒くらいです。これにより、例外の詳細な記録、開発者への充実した通知、および例外の詳細をオンラインで見られるユーザーフレンドリなWebページが提供されます。ぜひ試してください。 注
この記事のダウンロードサンプルでは、ELMAHライブラリを使ってSQL Server 2005 Express Editionデータベースにエラーを記録します。
まとめ Webアプリケーションで未処理の例外が発生した場合、通常はエンドユーザーにユーザーフレンドリなカスタムエラーページが表示され、例外の詳細が「処理」されるようにしたいと思うでしょう。例外をどのように処理するかはアプリケーションごとに違ってくるでしょうが、通常は例外を記録し、開発者に通知します。前回の記事「未処理の例外への適切な対処法」では、カスタムエラーページの表示方法を説明し、今回の記事では、アプリケーションの 例外の記録と通知を行うシステムを独自に作成するよりも、フリーなオープンソースライブラリのELMAHを試してみるようお勧めします。ELMAHには、未処理の例外を記録するためのHTTPモジュールと、例外の詳細を電子メールで送るためのオプションが含まれています。 それでは、ハッピープログラミング! 参考資料
著者紹介Scott Mitchell(Scott Mitchell)
|