Я пишу обработчики запросов в моем приложении 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 после выполнения этот код.