【问题标题】:ASP.NET MVC Controller.OnException not being calledASP.NET MVC Controller.OnException 未被调用
【发布时间】:2009-06-06 18:42:13
【问题描述】:

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

【问题讨论】:

  • “当控制器引发异常时,永远不会调用 OnException 方法”——你用调试器检查了吗?从你的问题看不清楚。
  • 我已经从调试器中尝试过,并使用日志语句并在调试器之外运行它。它们似乎都不适合我。

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


【解决方案1】:

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

filterContext.ExceptionHandled = true;

【讨论】:

  • 减 1. 根本没有回答问题。
【解决方案2】:

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

所以,听起来它可能只会在动作方法中发生未处理的异常时触发。

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

    public ActionResult Index ( )
    {
        throw new NotImplementedException ( );
    }

【讨论】:

    【解决方案3】:

    我在 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】:

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

      【讨论】:

        【解决方案5】:

        同样的规则适用于Controller.OnExceptionHandleErrorAttribute

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

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

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

        【讨论】:

          【解决方案6】:

          [HandleError] 属性应用于类。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-14
            • 2017-03-30
            • 1970-01-01
            • 2021-10-02
            • 1970-01-01
            相关资源
            最近更新 更多