Global.asax中的Application_Error似乎只捕获MVC运行时生成的错误。还有其他解决方案涉及覆盖Controller.OnException。
是否可以从所有控制器(包括我的代码生成的控制器)创建一个能够捕获所有错误的错误处理程序?
答案 0 :(得分:4)
是 - 如果您查看Global.asax,GlobalFilterCollection
已添加到 filters.Add(new HandleErrorAttribute());
HandleErrorAttribute
但是默认的HandleErrorAttribute将只处理内部服务器错误,即所有不是HttException的异常和错误代码为500的HttpExceptions。您可以从该属性派生以处理所有异常并进一步自定义默认行为。
{{1}}是asp.net mvc中标准的错误处理方式。
答案 1 :(得分:1)
就像archil所说的那样,你甚至不需要用[HandleError]装饰控制器/动作,因为默认情况下(在MVC3中)它是打开的。
如果出错,它将返回Error.cshtml视图,如果您使用了项目模板,则该视图位于Views / Shared中。
如果需要,您可以稍微自定义它,模型是HandleErrorInfo,这样您就可以将控制器名称,操作,消息和堆栈跟踪拉出来,如果您想要一个漂亮的自定义异常消息。这里有一个问题:你不能在这个页面上有任何逻辑/操作。
您必须在Web.config中启用自定义错误,否则您将获得标准的黄色屏幕:
<system.web>
<customErrors mode="On"/>
...
</system.web>
在customErrors中,您可以定义一个静态回退页面,以防其他所有内容失败。