.NET Core异常过滤器会停止控制器执行

时间:2016-11-14 11:02:17

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

我有一个奇怪的问题,或者是一个预期的问题(我没有得到它)​​。

我编写了一个异常过滤器,因此它可以捕获一个特定的异常并将该异常消息添加到ModelState(以避免在控制器中使用try / catch块)。

我遇到的问题是,当异常发生时,我得到一个空白屏幕而不是视图。它似乎不会继续留在我认为它应该在控制器中的位置。

过滤器:

public class ValidationFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        context.ExceptionHandled = true;
        context.ModelState.AddModelError("", context.Exception.Message);
    }
}

1 个答案:

答案 0 :(得分:1)

对我来说似乎很合乎逻辑。如果您在此处执行异常处理,则需要确保作为响应返回的内容,因为流已中断。

我想这是一个正在发生的事情的模型:

try
{
   var model = SomeMethodThatThrowsException();
   return View(model);
}
catch
{
}

现在,如果第一行抛出异常,除非你在那里处理并告诉它该做什么,它怎么能继续返回一个视图?

我不是百分之百确定它不可能做你想要的,但这似乎是合乎逻辑的(至少在使用以前版本的ASP.NET之后)流程。

可能的解决方案

  • 重定向到特殊错误页面,例外情况为例如
  • 转换为json并在SPA应用程序中处理结果。
  • 如果您需要将错误添加到返回的视图中,您可以使用单独的服务或简单的委托来装饰您的函数调用,例如。
public void MyAction()
{
    MyModel model = ExecuteSafely(SomeMethodThatThrowsException());
    return View(model);
}

private MyModel ExecuteSafely(Func<MyModel> action)
{
    try
    {
       return action();
    }
    catch
    {
        // Add what you need to a model/view/etc. here
        return null;
    }
}

这是一些例子,因此不可能编译,但只是说明我的意思。