Serilog прекращает регистрировать исключения, как только я добавляю пользовательский ExceptionFilter - PullRequest
2 голосов
/ 06 ноября 2019

Я добавил Serilog в свой проект:

Program.cs

.UseSerilog((provider, context, loggerConfiguration) =>
{
    loggerConfiguration
        .MinimumLevel.Verbose()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Warning);
        .WriteTo.MSSqlServer(output, tableName: "Log", schemaName: "WPS")
        .Enrich.WithAspnetcoreHttpcontext(provider)
        .Enrich.WithExceptionDetails();
});

Я также добавил службу для обработки ошибок API, возвращаемых в пользовательский интерфейс:

Startup.cs

// Add Error Handling to all API endpoints
services.AddMvc(options => {
      options.Filters.Add(new ApiExceptionFilter());
});

ApiExceptionFilter.cs

public class ApiExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        ApiError apiError = null;
        if (context.Exception is ApiException)
        {
            var ex = context.Exception as ApiException;
            context.Exception = null;
            apiError = new ApiError(ex.Message);
            apiError.Errors = ex.Errors;
            context.HttpContext.Response.StatusCode = ex.StatusCode;
        }
        else if (context.Exception is UnauthorizedAccessException)
        {
            apiError = new ApiError("Unauthorized Access");
            context.HttpContext.Response.StatusCode = 403;
        }
        else
        {
            string msg = context.Exception.GetBaseException().Message;
#if !DEBUG
            string stack = "";
#else
            string stack = context.Exception.StackTrace;
#endif

            apiError = new ApiError(msg);
            apiError.Detail = stack;
            context.HttpContext.Response.StatusCode = 500;
        }
        context.Result = new JsonResult(apiError);

        base.OnException(context);
    }
}

Однако после добавления ApiExceptionFilter исключения больше не регистрируются.

Я пытался выброситьснова исключение, но затем мое пользовательское сообщение больше не возвращается в пользовательский интерфейс.

ApiExceptionFilter.cs

        base.OnException(context);
        throw context.Exception.GetBaseException(); // throw again?

Есть предложения о том, где я ошибаюсь?

1 Ответ

0 голосов
/ 11 ноября 2019

Лучше всего здесь поймать и отфильтровать исключение, как вы делаете здесь, но также и зарегистрировать его в своем фильтре исключений.

Обычно код перехватывает и обрабатывает исключениеотвечает за его регистрацию;это то, что происходит без фильтра - обработчик исключений верхнего уровня перехватывает и регистрирует исключение. Как только вы начинаете обрабатывать исключение самостоятельно, вы также отвечаете за его регистрацию.

...