【问题标题】:Error handling last chance to catch View Rendering exception错误处理捕捉视图渲染异常的最后机会
【发布时间】:2016-06-25 11:52:26
【问题描述】:

我有 ErrorController 自定义处理我的网站错误。

这很标准:

public class ErrorController : BaseController
{
    public ActionResult Error404(Exception ex)
    {
        return View();
    }
    public ActionResult Error500(Exception ex)
    {
        return View();
    }
}

但是,如果在 View 代码中发生某些渲染异常(这可能会发生,因为该页面具有母版页(主布局)并且可能会发生不同的情况),那么我无法捕获该渲染异常。

通过实现ActionFilterAttribute.OnResultExecuted,我真的可以看到这个异常:

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        if (filterContext.Exception != null)
        {
            // not sure what to do here
        } else base.OnResultExecuted(filterContext);
    }

但在这种情况下,MVC 会在该异常发生后查找 ~/Shared/Error.cshtml(包括此路径),并且我无法向用户提供错误视图呈现异常 - - “最后机会例外”。

有什么办法可以解决吗?

【问题讨论】:

    标签: asp.net-mvc razor error-handling viewrendering


    【解决方案1】:

    这是一篇关于 ASP.Net MVC 中的异常处理的好文章,应该会有所帮助

    Method 4:- Inheriting from “HandleErrorAttribute”

    public class CustomHandleErrorAttribute: HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            Exception ex = filterContext.Exception;
            filterContext.ExceptionHandled = true;
            var model = new HandleErrorInfo(filterContext.Exception, "Controller", "Action");
    
            filterContext.Result = new ViewResult()
            {
                ViewName = "Error",
                ViewData = new ViewDataDictionary(model)
            };
        }
    }
    

    然后你将它附加到你的基本控制器上。

    【讨论】:

    • 好的,谢谢!这真的有效。但是,如果有什么方法可以捕捉到Error.cshtml 视图渲染的异常呢? (因为它被调用(渲染)然后没有额外的动作调用 - 就像最后一个动作调用它而不是带有 prev 异常的视图)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2013-08-08
    • 2017-12-07
    • 2011-08-11
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多