【发布时间】:2018-08-20 21:23:50
【问题描述】:
我创建了一个全局异常处理程序中间件来捕获我的所有自定义异常。
在我的 DAL 中抛出异常时,我希望 middelware 会将其捕获为与抛出的类型相同的类型。
// API
[HttpGet]
[Route("api/users")]
public IActionResult Get(int id)
{
var user = _userService.GetById(id);
return Ok(user);
}
// Repository
public async Task<List<User>> GetById(int id)
{
throw new EntityNotFoundException("code", "message");
// .. return user
}
// Exception handler
public async Task Invoke(HttpContext httpContext)
{
try
{
await _next(httpContext);
}
catch (Exception ex) // ex is of type JsonSerializationException
{
if (ex is EntityNotFoundException)
{
// Handle exception
}
}
}
在上面的示例中,异常已被处理,但它是 JsonSerializationException 类型,带有 System.AggregateException 类型的 InnerException,其中包含另一个类型为 EntityNotFoundException 的 InnerException。
似乎异常嵌套在它传递的每一层(DAL > 服务 > API)。如何避免这种情况,以便将异常捕获为原始类型?
【问题讨论】:
-
您能否提供更多关于这是什么类型的处理程序的代码?似乎没有实现 IExceptionFilter 接口,是吗(看起来像一个动作过滤器)?也没有正确理解你 DAL 抛出异常然后 Service 也抛出异常?
-
只有 DAL 抛出异常。据我从其他示例中可以看出,异常处理程序不需要实现 IExceptionFilter:stackoverflow.com/questions/38630076/…(查看已接受的答案)
-
是的,您也可以实现过滤器属性,但您的过滤器中缺少 OnException 函数。你的实现不是动作过滤器吗?
-
它不是一个过滤器,它是一个自定义的中间件。使用过滤器是否能够将异常捕获为抛出的类型,还是不会产生影响?
-
为您的问题添加了答案,希望对您有所帮助。
标签: c# asp.net exception asp.net-core exception-handling