Централизованная обработка исключений не работает - PullRequest
0 голосов
/ 24 марта 2019

Я тестирую централизованную обработку исключений в моем приложении ASPNetCore и хотел посмотреть, будет ли возникать непредвиденное исключение, оно будет правильно обработано промежуточным программным обеспечением app.UseExceptionHandler () и зарегистрировано для определенной цели ведения журнала. Я отключил базу данных SQL, ожидающую увидеть метод Database.EnsureCreated () в конструкторе класса DbContext, выдавая исключение System.Data.SqlClient.SqlException. Проблема заключается в том, что оно выдает такое исключение, но оно появляется локально, а не обрабатывается центробежным обработчиком ошибок. В результате клиент никогда не получает ответного сообщения, объясняющего, что произошло с кодом состояния 500.

enter image description here

Это кажется странным, так как обработчик работает правильно, за исключением того, что я выкидываю внутри контроллеров.

Вот моя централизованная конфигурация обработчика исключений:

app.UseExceptionHandler(appError =>
            {
                appError.Run(async context =>
                {
                    var errorFeature = context.Features.Get<IExceptionHandlerFeature>();

                    if (errorFeature != null)
                    {
                        var exception = errorFeature.Error;              

                        logger.LogError(exception.ToString());

                        await context.Response.WriteAsync("An unexpected error occurred! Try again later");

                    }

                });
            });     

Может кто-нибудь сказать мне, дать мне подсказку о том, что я могу делать неправильно? Кто-нибудь сталкивался с подобной проблемой?

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

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

public class ExceptionFilter: IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        String message = String.Empty;

        Type exceptionType = context.Exception.GetType();
        if (exceptionType == typeof(NotImplementedException))
        {
            message = "A server error occurred.";
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotImplemented;
            context.Result = new RedirectResult("/Home/Index");
        }
        else if (exceptionType == typeof(AppException))
        {
            message = context.Exception.ToString();
            context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            context.Result = new RedirectResult("/Home/Index");
        }
        //HttpResponse response = context.HttpContext.Response;
        //response.StatusCode = (int)status;
        //context.Result = new RedirectResult("/Home/Index");
    }
}

А у тебя Startup.cs

app.UseMiddleware(typeof(ExceptionFilter));
0 голосов
/ 25 марта 2019

Ваш код выглядит хорошо для меня. То, что вы испытываете, является исключением из первого шанса. Это означает, что было сгенерировано исключение, которое в конечном итоге может быть обработано. Во время выполнения ваш ExceptionHandler должен прекрасно обработать ваше исключение.

Однако во время отладки Visual Studio прерывается для этого исключения. Поведение Visual Studio можно настроить в настройках исключений (Debug > Windows > Exception Settings). См. Документы Microsoft для получения дополнительной информации об этом.

Итак, что вам в основном нужно, это сказать Visual Studio продолжить отладку на SqlException

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...