2009-05-01 81 views
7

這裏就是我想在我Global.asax.vb做:如何在ASP.NET MVC中記錄未處理的異常?

Public Class MvcApplication 
    Inherits System.Web.HttpApplication 

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection) 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 
     routes.MapRoute(_ 
      "Error", _ 
      "error.html", _ 
      New With {.controller = "Error", _ 
         .action = "FriendlyError"} _ 
     ) 
     ... 
     'other routes go here' 
     ... 
    End Sub 

    Sub Application_Start() 
     RegisterRoutes(RouteTable.Routes) 
    End Sub 

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
     ... 
     'code here logs the unhandled exception and sends an email alert' 
     ... 
     Server.Transfer("http://www.example.com/error.html") 
    End Sub 

End Class 

但是Server.Transfer的失敗:

Invalid path for child request 'http://www.example.com/error.html'. A virtual path is expected.

我該如何解決這個問題?或者,有什麼更好的方式來做到這一點?

回答

9

我剛剛發現這個名爲ELMAH斯科特Hanselman的博客here這是一個錯誤記錄器/處理器,您可以使用而無需更改您的代碼。你可能想看看它,因爲它似乎與MVC很好地工作。

2

你必須specifiy虛擬路徑,即相對於應用程序基礎的路徑(即沒有路徑外部應用程序),所以像: Server.Transfer的(「的error.html」) 或 服務器。轉移(「/的error.html」) 或 Server.Transfer的(「〜/的error.html」)

+0

「〜/ error.html」:執行/error.html的子請求時出錯。 – 2009-05-01 16:08:04

+0

「/error.html」:執行/error.html的子請求時出錯。 – 2009-05-01 16:08:08

3

ELMAH是一個優秀的錯誤處理捕捉未處理的異常。它通過HttpModules無縫地插入到您的Web應用程序中,並提供各種通知和日誌記錄選項。

特點:

  • SQL,XML,SQLite的,InMemory記錄
  • 電子郵件通知
  • RSS提要
  • 詳細!例外的記錄
  • 易於集成
  • 錯誤信號 - 發出一個錯誤的錯誤處理程序,而「dieing很好」,爲用戶

,僅供參考,SO使用ELMAH,儘管分支版本。這是最好的architectural explanationsetup tutorial

2

默認情況下,ASP.NET MVC應用程序有共享/ Error.aspx視圖,從

System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo> 

繼承如果你的控制器使用屬性[的HandleError],所有的異常會繼續冒泡直到被捕獲,並且它們將在該頁面上結束。

我只是增加了一個內嵌的Page_Load(在這種情況下,有效的,因爲它是該行的末尾):

<script runat="server"> 
    Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs) 
    MyExceptionHandlerService.LogException("exceptionsource", this.Model.Exception) 
    End Sub 
</script> 

它後,友好「對不起......」的字樣。它絕對看起來像ELMAH更強大,但爲了我的需要,這已經足夠了。