在ASP.NET MVC应用程序中使用HandleErrorAttribute

时间:2013-09-26 10:41:46

标签: c# asp.net-mvc attributes asp.net-mvc-5

我有一个关于在我的MVC 5应用程序中使用HandleErrorAttribute的最佳方法的问题。 我们知道,我们可以将此属性添加到全局过滤器中:

 filters.Add(new HandleErrorAttribute{View = "Error"});

这涉及应用程序每次在任何级别的应用程序中抛出未处理的异常时显示“错误”视图。 但是,如果我在其他全局授权或动作过滤器中有一些逻辑,产生一些异常,比第一次出现异常时,则app尝试重定向到Error View,再次其他过滤器开始执行并再次产生相同的异常,所以asp .net以避免此循环终止应用程序。 那么如何使用这个HandleErrorAttribute来避免这种行为的最佳方法呢? 谢谢!

修改 经过一些调试后,我发现这不是HandleErrorAttribute的常见行为,所以只有当我使用自定义路由f.e时才会出现这种循环。

{key}/{controller}/{action}

当过滤器逻辑中出现一些错误时,app会尝试重定向到Error View,但是另一个过滤器逻辑再次开始exectue,我甚至在{key} route参数中看到一个“Error”值,所以这是不需要的行为。 当我使用默认路由{controller}/{action}时 这没有发生,我完全得到错误视图而没有第二次执行任何全局过滤器逻辑。

2 个答案:

答案 0 :(得分:9)

您应该将动作过滤器逻辑包含在try catch内,然后在catch块内,重定向到Error视图并传递Exception

您唯一的另一种选择是完全抛弃HandleError并使用Global.asax中的Application_Error事件来管理您的错误处理。这样,无论发生错误的位置如何,您都可以重定向到其中的Error操作。

答案 1 :(得分:3)

Matt关于global.asax是正确的......这是我遵循的例子 http://www.digitallycreated.net/Blog/57/getting-the-correct-http-status-codes-out-of-asp.net-custom-error-pages

然后在每个视图中我添加:Response.StatusCode = 500;或者我希望向客户展示其他代码。