.Ner Core Custom中间件不捕获服务异常

时间:2019-02-06 09:52:50

标签: asp.net .net exception core

因此,我刚刚遵循了本教程: https://code-maze.com/global-error-handling-aspnetcore/ 一切似乎都工作正常,但涉及服务时,它不会处理任何异常,因此会关闭我的应用程序。关于调试,这没什么大不了的,但是我需要它在实际环境中工作,而且我想捕获每个异常,以免关闭应用程序。

StatusService.cs

public async void Add(List<Status> status) 
    {
        throw new Exception();
        await this.status.InsertManyAsync(status);
    }

StatusController.cs

 [HttpPost("add")]
    public IActionResult Add( [FromBody] List<Status> status)
    {
        if(status.Count > 0)
        {
            try
            {
                statusService.Add(status);
                return Ok();
            }
            catch (Exception ex) { throw ex; }
        }
        return BadRequest("Array must not be empty");
    }

因此,如果在StatusController处引发异常,则可以正常工作,但是当我调用statusServices并引发该异常时,我的应用程序可以正常工作。 是否有一种解决方法可以将异常引发到Controllers上,或者让我的中间件捕获到每个类中?

1 个答案:

答案 0 :(得分:0)

您可以使用过滤器来捕获所有未处理的异常。

 public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly ILoggerFactory _loggerFactory;
        public CustomExceptionFilterAttribute(ILoggerFactory loggerFactory)
        {
            _loggerFactory = loggerFactory;
        }
        public override void OnException(ExceptionContext context)
        {
            var logger = _loggerFactory.CreateLogger(context.ActionDescriptor.DisplayName);
            logger.LogError(context.Exception, "Action Error");
            var result = new ObjectResult(null)
            {
                StatusCode = StatusCodes.Status500InternalServerError
            };
            context.Result = result;
        }
    }

也不要以这种方式抛出异常:

catch (Exception ex) { throw ex; }

因为您丢失了部分错误堆栈跟踪。只是写

catch (Exception) { throw; }