ASP.NET MVC Controller.OnException未被调用

时间:2009-06-06 18:42:13

标签: c# asp.net-mvc controller onexception

我有一个基本控制器类,我将覆盖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();
        }
}

6 个答案:

答案 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.OnExceptionHandleErrorAttribute

此处HandleErrorAttribute

注明customError所需的配置

如果web.config设置为mode="RemoteOnly" mode="Off"并且您正在本地调试,或者您有mode="On",则不会处理异常,您将看到ASP .Net黄色屏幕,带有堆栈跟踪。

如果您设置了mode="RemoteOnly",或者您正在远程查看该网站并且OnException partitioning方法将正常执行。

答案 5 :(得分:-1)

[HandleError]属性应用于班级。