我肯定會推薦ELMaH,而不是自己編寫這個代碼,並且還會通過Log4Net來爲您的MVC應用程序編寫代碼。我個人會避免任何異常處理,除非我有特定的功能響應。通過這種方式,我不會「吃」ELMaH等應用程序範圍的工具將爲我優雅處理的任何錯誤。
ELMaH還有很好的內置網絡報告功能,還有專門用於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 PLE。如果你正在做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使用額外的工作。 How to get ELMAH to work with ASP.NET MVC [HandleError] attribute?
看看像ELMAH –
是的,我打算使用log4net,但沒有決定。 – Sunny
爲什麼要重新發明輪子?我承認很高興知道它是如何工作的,但是在你明白自己寫的東西沒有真正的意義,除非它不做你想做的事情,log4net的目標是稍微不同的日誌記錄,然後elmah,我將elmah看作更多意外的異常日誌記錄和log4net記錄應用程序事件/已知錯誤 –