C# .NET核心异常筛选器停止控制器执行
我遇到了一个奇怪的问题,或者是一个预期的问题(只是我没有得到它) 我编写了一个异常过滤器,这样它就可以捕获特定的异常并将该异常消息添加到ModelState(以避免在控制器中使用try/catch块) 我遇到的问题是,当异常发生时,我会看到一个空白屏幕,而不是视图。它似乎没有继续留在控制器中,我认为它应该继续 过滤器:C# .NET核心异常筛选器停止控制器执行,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,我遇到了一个奇怪的问题,或者是一个预期的问题(只是我没有得到它) 我编写了一个异常过滤器,这样它就可以捕获特定的异常并将该异常消息添加到ModelState(以避免在控制器中使用try/catch块) 我遇到的问题是,当异常发生时,我会看到一个空白屏幕,而不是视图。它似乎没有继续留在控制器中,我认为它应该继续 过滤器: public class ValidationFilter : ExceptionFilterAttribute { public override void OnExc
public class ValidationFilter : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
context.ExceptionHandled = true;
context.ModelState.AddModelError("", context.Exception.Message);
}
}
对我来说似乎很合乎逻辑。如果在这里执行异常处理,则需要确保作为响应返回的内容,因为流被中断 我想这是正在发生的事情的一个模型:
try
{
var model = SomeMethodThatThrowsException();
return View(model);
}
catch
{
}
现在,如果第一行抛出了异常,它将如何继续返回视图,除非您在那里处理它并告诉它该怎么做
我不是100%确定不可能实现您想要的,但这似乎相当符合逻辑(至少在使用以前版本的ASP.NET之后)
可能的解决办法
- 重定向到一个特殊的错误页面,将您的异常作为模型,例如
- 转换为json并在SPA应用程序中处理结果
- 如果需要将错误添加到返回的视图中,则可以使用单独的服务或简单的委托(例如
public void MyAction()
{
MyModel model=ExecuteSafley(someMethodThrowsException());
返回视图(模型);
}
私有MyModel执行安全(Func操作)
{
尝试
{
返回动作();
}
抓住
{
//在此处向模型/视图等添加所需内容
返回null;
}
}
这是一个示例,因此可能不会编译,但只是给出我的意思。请参阅以获取替代方法我需要它继续并显示相同的视图而不是错误页面的原因是我需要将验证消息作为验证消息处理,而无需将用户重定向到另一个页面,允许他/她修复问题(如果可以修复的话)。我理解,我想你可以通过一个装饰程序来运行你的方法。因此,您毕竟需要在适当的位置尝试/捕获,而不是在过滤器中。我将扩展答案。
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;
}
}