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

7
这是我在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

但是该 Server.Transfer 失败:

无效的子请求路径 'http://www.example.com/error.html'。应使用虚拟路径。

我该如何解决这个问题?或者,有更好的方法吗?

4个回答

9

我在Scott Hanselman的博客这里发现了一个名为ELMAH的东西,它是一个错误日志记录器/处理程序,您可以在不更改代码的情况下使用。如果您正在使用MVC,那么您可能需要考虑一下它,因为它似乎与MVC很好地配合。


7
我们在 Stack Overflow 上使用了一个修改版的 ELMAH,它非常好。 - Jarrod Dixon
2
@Jarrod - 你们的分支中包括了哪些类型的内容? - Gavin Miller
ELMAH规则 - 在我看来比log4net更有帮助。 - MikeJ

3

ELMAH 是一个出色的错误处理程序,可捕获未处理的异常。它通过 HttpModules 无缝地插入到您的 Web 应用程序中,并具有各种通知和日志记录选项。

特点:

  • SQL、XML、SQLite、InMemory 日志记录
  • 电子邮件通知
  • RSS 源
  • 详细!记录异常信息
  • 易于集成
  • 错误信号 - 在“漂亮地死亡”(即向用户显示友好错误页面)的同时向错误处理程序发送错误信号

顺便说一句,SO 使用 ELMAH,尽管是分支版本。这是最好的架构解释设置教程


2
默认情况下,ASP.NET MVC应用程序有一个视图Shared/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 更加健壮,但对于我的需求来说,这已经足够了。


2

您需要指定一个虚拟路径,即相对于应用程序基础路径的路径(即不包含应用程序外部的路径),因此可以使用以下格式:

  • Server.Transfer("error.html")
  • Server.Transfer("/error.html")
  • Server.Transfer("~/error.html")

请注意,路径必须以斜杠“/”或波浪线和斜杠“~/”开头。


"~/error.html": 执行/错误.html的子请求时出错。 - Zack Peterson
"/error.html": 执行子请求 /error.html 时出错。 - Zack Peterson
我刚做了相同的测试,它们都成功了,除非我输入了一个不正确的文件名,然后我会收到 "Error executing child request for /test_WRONG.html." 的错误消息。你确定 error.html 存在于根目录中吗? - JonoW
它不存在。应该路由到错误控制器的FriendlyError视图。 - Zack Peterson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接