【问题标题】:.NET Core Custom middleware does not catch services exceptions.NET Core 自定义中间件不捕获服务异常
【发布时间】:2019-06-30 05:36:28
【问题描述】:

所以我刚刚遵循了这个教程: 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 并引发异常时,我的应用程序可以正常工作。 是否有一种解决方法可以让控制器抛出异常,或者让我的中间件在每个类中捕获?

【问题讨论】:

    标签: asp.net exception .net-core


    【解决方案1】:

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

     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; }
    

    【讨论】:

    • 我试过了,但问题是一样的,如果在控制器内抛出异常它工作正常,但在另一个类中应用程序崩溃。
    • 那么问题出在其他地方。你能把这个项目的github repo的链接发过来吗?
    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2020-04-30
    • 2022-12-02
    • 2019-11-10
    相关资源
    最近更新 更多