我有一个基本控制器类,我将覆盖Controller.OnException处理程序方法,以便为将继承此类的某些类型的控制器提供一般错误处理(这些是将返回JSON结果的API控制器) )。当控制器引发异常时,永远不会调用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);
}
}
继承课程:
public class MyController : APIController
{
public AjaxResult ForcedException()
{
throw new SystemException();
}
}
答案 0 :(得分:10)
如果我正确理解您的问题 - 您的异常必须在OnException中标记为“已处理”。试试这个:
filterContext.ExceptionHandled = true;
答案 1 :(得分:2)
MSDN文档(http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx)声明OnException方法“在操作中发生未处理的异常时被调用。”
因此,听起来只有在动作方法中发生未处理的异常时才会触发。
我创建了一个带有一个Index操作的新控制器。并且OnException方法实际上确实执行。我也试过抛出一个SystemException()和OnException方法。
public ActionResult Index ( )
{
throw new NotImplementedException ( );
}
答案 2 :(得分:1)
您是通过单元测试还是通过ASP.NET调用控制器操作?如果您在测试中直接调用该方法,比如通过NUnit调用,那么OnException将不会触发:测试框架将处理异常并将其转换为失败的测试。
答案 3 :(得分:1)
我在ASP.NET MVC 3项目中遇到了完全相同的问题。
事实证明,这是Visual Studio和开发服务器的一项功能。在调试模式下,您将返回到Visual Studio并给出默认的异常对话框。
阻止这种情况发生的一种方法是更改Web.config
中的编译模式:
<compilation debug="true" targetFramework="4.0">
对此:
<compilation debug="false" targetFramework="4.0">
您也可以将调试模式设置为true,但是通过从visual studio菜单中选择Start without debugging option
来测试您的应用程序是否正常工作(通过按Ctrl+F5
调用。
答案 4 :(得分:0)
同样的规则适用于Controller.OnException
和HandleErrorAttribute
此处HandleErrorAttribute
customError
所需的配置
如果web.config
设置为mode="RemoteOnly"
mode="Off"
并且您正在本地调试,或者您有mode="On"
,则不会处理异常,您将看到ASP .Net黄色屏幕,带有堆栈跟踪。
如果您设置了mode="RemoteOnly"
,或者您正在远程查看该网站并且OnException
partitioning
方法将正常执行。
答案 5 :(得分:-1)
将[HandleError]
属性应用于班级。