ASP.NET MVC Controller.OnException未被调用
我有一个基本控制器类,我将覆盖Controller.OnException处理程序方法,以便为将inheritance此类的某些类型的控制器提供一般error handling(这些控制器将返回JSON结果)。 当控制器引发exception时,永远不会调用OnException方法。 有谁看到我做错了什么,还是有更好的方法来处理这种情况?
使用MVC 1.0
基类:
public class APIController : Controller { protected override void OnException(ExceptionContext filterContext) { //This is never called filterContext.Result = new JsonResult(); base.OnException(filterContext); } }
inheritance类:
public class MyController : APIController { public AjaxResult ForcedException() { throw new SystemException(); } }
如果我正确理解您的问题 – 您的exception必须在OnException中标记为“已处理”。 试试这个:
filterContext.ExceptionHandled = true;
MSDN文档( http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx )声明OnException方法“在操作中发生未处理的exception时被调用”。
所以,听起来它可能只在动作方法中发生未处理的exception时触发。
我用一个Index动作创建了一个新的控制器。 并且OnException方法实际上确实执行。 我也试过抛出一个SystemException()和OnException方法。
public ActionResult Index ( ) { throw new NotImplementedException ( ); }
您是通过unit testing还是通过ASP.NET调用控制器操作? 如果您在测试中直接调用该方法,比如通过NUnit调用,那么OnException将不会触发:测试框架将处理exception并将其转换为失败的测试。
我在ASP.NET MVC 3项目中遇到了完全相同的问题。
事实certificate,这是Visual Studio和开发服务器的一个function。 在调试模式下,您将返回到Visual Studio并给出默认的exception对话框。
阻止这种情况发生的一种方法是更改Web.config
的编译模式:
对此:
您也可以将调试模式设置为true,但是通过从visual studio菜单中选择Start without debugging option
来测试您的应用程序是否有效(通过按Ctrl+F5
调用。
与HandleErrorAttribute
相同的规则适用于Controller.OnException
HandleErrorAttribute
所需的配置在HandleErrorAttribute
注明https://stackoverflow.com/a/528550/939634
如果web.config
customError
设置为mode="RemoteOnly"
并且您正在本地调试或者您有mode="Off"
,则不会处理exception,您将看到带有堆栈跟踪的ASP.Net黄色屏幕。
如果设置mode="On"
或者您正在远程查看站点并且具有mode="RemoteOnly"
OnException
方法将正确执行。
将[HandleError]
属性应用于类。