Лучший способ справиться с повторно используемым кодом в блоке catch - PullRequest
0 голосов
/ 08 мая 2019

Я пишу обработчики запросов в моем приложении API. Это приложение связывается со многими (микро) сервисами по HTTP. Поэтому я написал класс для каждой службы (AuthService, LogService, DatabaseService в коде примера) с методами (Login, TryLog, GetPets в коде примера), которые могут вызвать исключение ServiceException при сбое связи.

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

Пример кода:

public override async Task HandleRequest()
{
    try
    {
        AuthService.Login(this._Token);
    }
    catch (ServiceException se)
    {
        // specific code
        LogService.TryLog("Signing in failed");

        // shared code
        LogService.TryLog("Handling request failed.");
        this.Respond(HttpStatusCode.InternalServerError);
        return;
    }

    try
    {
        this._Pets = DatabaseService.GetPets(kind: "dog");
    }
    catch (ServiceException se)
    {
        // specific code
        LogService.TryLog("Getting pets failed");

        // shared code
        LogService.TryLog("Handling request failed");
        this.Respond(HttpStatusCode.InternalServerError);
        return;
    }

    this.Respond(HtppStatusCode.OK, this._Pets);
}

Как видите, в каждом блоке catch мне нужно выполнить некоторый код, уникальный для этого блока catch, и некоторый код, который одинаков для всех блоков catch.

Каков наилучший / рекомендуемый способ повторного использования такого кода?

Опции, которые я придумал:

  • Продолжайте перехватывать исключения локально, перемещайте «общий» код в метод и вызывайте этот метод в каждом исключении.
  • Прекратите локальный перехват исключений, добавьте одну «глобальную» попытку / перехват в методе «HandleRequest», который перехватывает все исключения ServiceException, передайте метод Action / делегат каждому методу службы, который обрабатывает уникальные случаи, но по-прежнему выдает исключение ServiceException после выполнения этот код.
...