代码之家  ›  专栏  ›  技术社区  ›  Zack Peterson

如何在ASP.NET MVC中记录未处理的异常?

  •  7
  • Zack Peterson  · 技术社区  · 16 年前

    以下是我在global.asax.vb中的尝试:

    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
    

    但是服务器传输失败:

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

    我该怎么解决这个问题?或者,有什么更好的方法可以让我这样做?

    4 回复  |  直到 16 年前
        1
  •  9
  •   Joseph    16 年前

    我刚在斯科特·汉塞尔曼的博客上找到这个 here 打电话 ELMAH 这是一个错误记录器/处理程序,您可以使用它而不必更改代码。你可能想看看它,因为它似乎与MVC很好地合作。

        2
  •  3
  •   Gavin Miller    16 年前

    ELMAH 是捕获未处理异常的优秀错误处理程序。它通过httpmodules无缝地插入您的Web应用程序,并具有各种通知和日志记录选项。

    特征:

    • SQL、XML、SQLite、InMemory日志记录
    • 电子邮件通知
    • RSS馈源
    • 详细的!异常记录
    • 易于集成
    • 错误信号-向错误处理程序发出错误信号,同时为用户“很好地处理”错误。

    仅供参考,所以使用Elmah,尽管是分叉版本。这是最好的 architectural explanation setup tutorial

        3
  •  2
  •   JonoW    16 年前

    您必须指定一个虚拟路径,即相对于应用程序基的路径(即,应用程序外部没有路径),因此如下所示: server.transfer(“错误.html”) 或 server.transfer(“/error.html”)。 或 server.transfer(“~/error.html”)。

        4
  •  2
  •   Peter J    16 年前

    默认情况下,ASP.NET MVC应用程序具有视图shared/error.aspx,继承自

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

    如果您的控制器使用属性[handleError],则所有异常将继续冒泡,直到捕获为止,并最终出现在该页上。

    我只是添加了一个内联页面加载(在本例中有效,因为它是行的结尾):

    <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>
    

    之后,友好的“对不起…”信息。看起来埃尔玛确实更强壮,但就我的需要而言,这就足够了。