10

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

6 回答 6

12

如果我正确理解您的问题 - 您的异常必须在 OnException 中标记为“已处理”。尝试这个:

filterContext.ExceptionHandled = true;
于 2009-06-06T20:32:41.257 回答
2

MSDN 文档 ( http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.oneexception.aspx ) 声明 OnException 方法“在操作中发生未处理的异常时调用”。

因此,听起来它可能仅在操作方法中发生未处理的异常时触发。

我用一个索引操作创建了一个新控制器。而且 OnException 方法确实会执行。我还尝试抛出 SystemException() 并且也触发了 OnException 方法。

    public ActionResult Index ( )
    {
        throw new NotImplementedException ( );
    }
于 2009-06-16T20:37:53.703 回答
2

我在我的 ASP.NET MVC 3 项目中遇到了完全相同的问题。

事实证明,这是 Visual Studio 和开发服务器的一个特性。在调试模式下,您将返回到 Visual Studio 并给出默认的异常对话框。

阻止这种情况发生的一种方法是从以下更改您的编译模式Web.config

<compilation debug="true" targetFramework="4.0">

对此:

<compilation debug="false" targetFramework="4.0">

您也可以将调试模式设置为 true,但通过Start without debugging option从 Visual Studio 菜单中选择 来测试您的应用程序是否正常工作(通过按Ctrl+F5.

于 2012-11-28T12:26:44.293 回答
1

您是从单元测试还是通过 ASP.NET 调用控制器操作?如果您在测试中直接调用该方法,例如通过 NUnit,则 OnException 不会触发:测试框架将处理异常并将其转变为失败的测试。

于 2009-10-01T15:40:59.607 回答
0

相同的规则适用Controller.OnExceptionHandleErrorAttribute

HandleErrorAttribute此处注明所需的配置https://stackoverflow.com/a/528550/939634

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

如果您设置mode="On"或您正在远程查看站点并且mode="RemoteOnly"您的OnException方法将正确执行。

于 2018-03-09T18:39:03.647 回答
-1

[HandleError]属性应用到类。

于 2009-06-06T20:15:09.747 回答