このコードを自分で書くのではなく、ELMaH をお勧めします。また、MVC アプリには Log4Net を使用することをお勧めします。私は個人的に例外処理を避けています。このようにして、ELMaH などのアプリケーション全体のツールが適切に処理するエラーを「食べる」ことはありません。
ELMaH には優れた Web レポートも組み込まれており、ELMaH 専用のサードパーティ製ツールがあり、最も頻繁に発生するエラーなどの統計情報を得ることができます。
カスタムエラーリダイレクトから始めるかもしれません...
<customErrors defaultRedirect="~/site/error" mode="RemoteOnly">
<error statusCode="404" redirect="~/site/notfound" />
</customErrors>
...ELMaH を使用していることを認識しているコントローラーに...
public virtual ActionResult Error() {
System.Collections.IList errorList = new System.Collections.ArrayList();
ErrorLog.GetDefault(System.Web.HttpContext.Current).GetErrors(0, 1, errorList);
ErrorLogEntry entry = null;
if (errorList.Count > 0) {
entry = errorList[0] as Elmah.ErrorLogEntry;
}
return View(entry);
}
...訪問者が特定のエラー ID を取得するのに役立つビューに支えられています。
@model Elmah.ErrorLogEntry
@if (Context.User.Identity.IsAuthenticated) {
<p>Since you are signed in, we've noted your contact information,
and may follow up regarding this to help improve our product.</p>
} else {
<p>Since you aren't signed in, we won't contact you regarding this.</p>
}
<p>Error ID: @Model.Id</p>
この例では、これが HttpPost であることにも気付きました。AJAX を使用している場合は、それらのエラーを独自の方法で処理する必要があります。すべての AJAX コードが正常に処理される、ブラウザーに送信できる標準応答を選択します。おそらく、JavaScriptアラートにELMaHエラーIDを表示することによって(簡単な例として)。
また、Global.asax を介していくつかの特殊なタイプの AJAX エラーを処理します。
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302 &&
Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
HandleErrorAttribute は便利な機能ですが、ELMaH と組み合わせて使用するには余分な作業があることはよく知られています。ELMAH を ASP.NET MVC [HandleError] 属性で動作させるにはどうすればよいですか?