| デベロッパー | 2006年12月12日 10:00 |
|
未処理の例外への適切な対処法 著者: Scott Mitchell オリジナル版を読む ▼2006年12月12日 10:00 付の記事 ■海外internet.com発の記事 はじめに.NETアプリケーションでは、不正な処理(無効なキャスト、null値の参照、オフラインのデータベースへの接続など)を実行すると、「例外」というものが発生します。コード内でTry/Catchブロックを使用すると、例外をキャッチして直接処理できます。ASP.NETアプリケーションの場合、コード内で処理されていない例外はASP.NETのランタイムに通知され、HttpUnhandledExceptionが発生します。既定では、未処理の例外が発生した場合は「ランタイムエラー」というテキストがページに表示され、例外の詳細を確認する方法についての開発者向けの説明が示されます(図1を参照)。この「ランタイムエラー」ページは、外部のサイト訪問者に表示されるページです。開発者自身がローカルホストでサイトを表示しているときには、未処理の例外が発生すると、発生した例外の種類と詳細が既定のエラーページで表示されます。 エンドユーザーがこの「ランタイムエラー」ページを見たら、不安と戸惑いを覚えるのは確実です。ごく普通のコンピュータユーザーが「ランタイム」の意味を知っているとは思えないからです。すべてのユーザーに伝わるのは、何かとんでもない事態が発生したということです。ユーザーは、データやこれまでの作業が失われたのではないか、エラーの原因は自分の操作にあったのではないかと、恐れをなすかもしれません。皮肉なことに、未処理の例外が発生したことの当事者である開発者は蚊帳の外です。エンドユーザーがエラーの詳細(どのページでエラーが発生したかや、その直前にユーザーが行った操作など)をメールで知らせてくれるまで、エラーの発生を把握できないのです。 幸い、ASP.NETには、これら2つの問題の解決策が用意されています。問題発生をもっと穏便に伝えるページに自動的にリダイレクトするよう、ASP.NETアプリケーションを設定できるのです。このユーザーフレンドリなカスタムのエラーページでは、「ランタイム」などの専門用語は使わずに済みますし、Webサイト全体とページの見た目を統一できます。さらには、未処理の例外が発生したことをログに記録して開発者に通知するための方法もあります。この記事では、未処理の例外が発生したときにユーザーフレンドリなエラーページを表示する方法を説明します。そのような例外が発生したときにログに記録してサイト管理者に通知する方法については、別の記事(『Processing Unhandled Exceptions』)で説明する予定です。 未処理の例外が発生したときにユーザーフレンドリなエラーページを表示する 未処理の例外がASP.NETのランタイムに通知されると、アプリケーションの
未処理の例外が発生したときは、すべての閲覧者に対し、「ランタイムエラー」ページまたはユーザーフレンドリなカスタムのエラーページを表示します。
未処理の例外が発生したときは、すべての閲覧者に対し、例外の詳細ページを表示します。
リモートユーザー(ローカルホスト以外から閲覧しているユーザー)に対しては、「ランタイムエラー」ページまたはユーザーフレンドリなカスタムのエラーページを表示します。ローカルユーザー(通常は開発者)に対しては、例外の詳細ページを表示します。
既定の「ランタイムエラー」ページではなくユーザーフレンドリなエラーページを表示するには、 具体例を見てみましょう。次のように
<customErrors mode="On" defaultRedirect="~/GeneralServerError.aspx" />
未処理の例外がASP.NETのランタイムに通知されると、ランタイムは、 注1
この記事の最初に紹介されているリンクから、
<customErrors>の設定の使用例を示すASP.NET 2.0のWebアプリケーションのサンプルをダウンロードできます。エラーに応じて異なるページにユーザーをリダイレクトする ユーザーフレンドリなエラーページを 例えば、次のように <customErrors mode="On" defaultRedirect="~/GeneralServerError.aspx"> <error statusCode="404" redirect="~/FourOhFour.aspx" /> </customErrors> 表示する404ページでは、要求されたページ(存在しないページ)を 1つ注意してほしいのですが、 注2
Visual Studio 2005に同梱されているASP.NETの開発WebサーバーをファイルシステムベースのWebサイトで使用している場合は、すべてのリソースがASP.NETエンジンにマッピングされています。従って、HTMLページを要求するときにも
<customErrors>設定が適用されます。404エラーページをさらに改良する
「FourOhFour.aspx」のエラーページによって、存在しないページを表示しようとしたことをユーザーフレンドリなメッセージでエンドユーザーに表示できるようになりました。さらに少しコードを加えると、この404エラーページの利便性を大きく向上させることができます。例えば、存在しないWebページにユーザーがたどり着いた原因が、別のページ上のリンク切れにあった場合は、開発者にメールで通知して、リンク切れの修正を促すようにすると便利です。ASP.NETのWebページから電子メールを送信する方法の詳細については、『Sending Email in ASP.NET 2.0』または『Sending Email from an ASP.NET 1.x Web Page』を参照してください。
別の拡張法としては、無効なURLと正しいURLの対応表をデータベーステーブルの形で用意するという方法も考えられます。404エラーページ内でデータベース検索を実行し、要求されたページ(存在しないページ)に対応する正しいURLがそのテーブルに登録されているかどうかを確認します。そして、登録されている場合は、ユーザーを正しいURLに自動的にリダイレクトするという方法です。この機能が役立つのは、例えば次のような場合です。よそのWebサイトから自分のWebサイトの特定のページにリンクが張られているのに、リンク元にスペルミスがあって、リンク切れになってしまっているとしましょう。先方のWebサイトのリンクを修正してもらうのが理想的ですが、他人が問題を修正してくれるのを待つという受け身の姿勢ではなく、スペルミスのURLと正しいページを対応付けるという能動的な姿勢で望むことが可能です。そうすれば、先方のWebサイトの切れたリンクから自分のサイトにやって来たユーザーを、正しいページに自動的にリダイレクトできます。 まとめ 未処理の例外が発生したときにASP.NETのランタイムが行う処理は3種類に分かれます。すなわち、汎用的な「ランタイムエラー」ページを表示するか、例外の詳細を表示するか、ユーザーフレンドリなカスタムのエラーページを表示するかのいずれかです。既定では、リモートユーザーには「ランタイムエラー」ページが表示され、ローカルホストから表示しているユーザー(通常は開発者)には例外の詳細ページが表示されます。しかし、既定の「ランタイムエラー」ページの代わりにカスタムのエラーページを表示することは簡単です。これらの設定は、Web.configの それでは、ハッピープログラミング! 著者紹介Scott Mitchell(Scott Mitchell)
|