Вход в обработчик исключений промежуточного программного обеспечения - PullRequest
0 голосов
/ 02 мая 2019

В многоуровневом веб-приложении я хочу переместить всю регистрацию ошибок из слоев «Домен» и «Данные» в глобальный обработчик исключений, но я не уверен, каков компромисс.Я хочу удалить любой вызов журнала и заменить его более конкретным исключением (настраиваемым, если это необходимо) или удалить перехват:

try{
   . . . 
}
catch
{
   Logger.Error('Info'); // <-- remove this for a: throw new CustomException('Info', ex);
   throw;                // <-- then, remove this line
}

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

// Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseExceptionHandler(
    error =>
    {
        GlobalExceptionHandler.ErrorHandling(error, env);
    });
}

// GlobalExceptionHandler.cs
public static class GlobalExceptionHandler
{
    public static void ErrorHandling(IApplicationBuilder errorApp, IHostingEnvironment env)
    {
        errorApp.Run(async context =>
        {
            .
            .
            .

            Log.Current.Error(exception.Message, () => exception);
        }
    }
}

Может быть лучший подход, чтобы избежать дублирования записей журнала?

1 Ответ

0 голосов
/ 02 мая 2019

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

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using MyProject.Interfaces;

namespace MyProject.Middlewares
{
    public class ErrorReporterMiddleware
    {
        private readonly RequestDelegate RequestDelegate;

        public ErrorReporterMiddleware(RequestDelegate requestDelegate)
        {
            RequestDelegate = requestDelegate ?? throw new ArgumentNullException(nameof(requestDelegate));
        }

        public async Task Invoke(HttpContext httpContext, IErrorReporter errorReporter)
        {
            try
            {
                await RequestDelegate(httpContext);
            }
            catch (Exception e)
            {
                await errorReporter?.CaptureAsync(e);
                throw;
            }
        }
    }
}

В этом случае IErrorReporter - это интерфейс, который я определил в пространстве имен MyProject.Interfaces.Я использую его для абстрагирования службы ведения журнала:

using System;
using System.Threading.Tasks;

namespace MyProject.Interfaces
{
    public interface IErrorReporter
    {
        Task CaptureAsync(Exception exception);
        Task CaptureAsync(string message);
    }
}

Затем в Startup.cs я просто добавляю следующую строку к методу Configure:

app.UseMiddleware<ErrorReporterMiddleware>();

Ничего особенного, кроме менядумаю, что это чистый подход.

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