Промежуточное ПО .Ner Core Custom не перехватывает исключения служб - PullRequest
0 голосов
/ 06 февраля 2019

Итак, я только что следовал этому руководству: https://code -maze.com / global-error-processing-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 и выбрасывается исключение, мое приложение работает.Есть ли обходной путь, чтобы исключение было выброшено на контроллерах, или чтобы мой промежуточный программный пакет срабатывал в каждом классе?

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете использовать фильтр для перехвата всех необработанных исключений.

 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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...