为什么我的自定义错误处理不起作用?

时间:2014-04-24 13:51:54

标签: asp.net asp.net-mvc iis

我在这样的代码中实现了一个自定义错误处理程序:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    'get the exception
    Dim ex = Server.GetLastError()

    'log it
    ex.LogToFile()

    'clear the error
    Server.ClearError()

    'build route data to route this exception to ErrorController
    Dim routeData = New RouteData()
    routeData.Values.Add("controller", "Error")
    routeData.Values.Add("action", "Index")
    routeData.Values.Add("exception", ex)

    'route to the error controller, preserving the context
    Dim controller As IController = New Controllers.ErrorController()
    controller.Execute(New RequestContext(New HttpContextWrapper(Context), routeData))
End Sub

然后/error/index操作方法以用户友好的方式显示异常。在我的开发机器上,这很好用。但是在部署的服务器上,当抛出异常而不是我的错误消息时,它会尝试使用预设错误页面,例如%SystemDrive%\inetpub\custerr\<LANGUAGE-TAG>\500.htm

如果我指定自己的500页,它会使用它,但没有我的自定义处理。

如果我像这样删除500页:

  <httpErrors>
    <remove statusCode="500" subStatusCode="-1" />
  </httpErrors>

我只是通过这条消息得到了一个白色的死亡屏幕:

The page cannot be displayed because an internal server error has occurred.

那么,我怎样才能让我的错误处理做正确的事呢?

2 个答案:

答案 0 :(得分:0)

我感觉HandleErrorAttribute造成了这种情况。检查Global.asax和App_Start / FilterConfig.vb以查看是否存在filters.Add(New HandleErrorAttribute())之类的行。

如果使用HandleErrorAttribute并且启用了自定义错误,MVC将在MVC工作流程中保留所有未处理的异常。这意味着来自views / controllers / etc的任何未处理的异常都不会冒泡到ASP.NET或IIS以允许Application_Error查看异常,并且您将在/Views/Shared/Errors.vbhtml上看到视图< / p>

查看您的代码,您几乎可以执行HandleErrorAttribute所做的事情。如果您只是尝试返回一个简单的失败视图,该属性允许您设置它使用的默认视图而不是一般的错误视图。

答案 1 :(得分:0)

似乎IIS确实想要处理500个错误,除非您明确告诉它不要使用以下代码行:

    'force our handling, instead of IIS handling
    Response.TrySkipIisCustomErrors = True

本文提供了大量有关此内容的信息:

http://weblog.west-wind.com/posts/2009/Apr/29/IIS-7-Error-Pages-taking-over-500-Errors