Прощавай, нудний Try — Catch! Елегантні рішення для обробки виключень

Вступ

У розробці програмного забезпечення обробка виключень є важливим аспектом, який не можна ігнорувати. Однак традиційний підхід обробки виключень try...catch...finally часто призводить до таких проблем, як надмірність коду, погана зручність для читання та відсутність узгодженості. Ця стаття розгляне, як вирішити ці проблеми за допомогою єдиного механізму обробки виключень, що підвищить елегантність і підтримуваність коду.

pic

Проблеми з традиційною обробкою виключень

Під час розробки часто використовується try...catch...finally для обробки виключень, що призводить до наступних проблем:

  1. Надмірність коду: Повторювана логіка обробки виключень розкидана по всьому коду, збільшуючи витрати на його обслуговування. Наприклад, подібні блоки try...catch потрібно писати в кожному методі, що робить код об'ємним.
  2. Погана зручність для читання: Вкладена логіка обробки виключень приховує основну бізнес-логіку, ускладнюючи розуміння та зміну коду. Розробники повинні витрачати додаткові зусилля для розрізнення бізнес-логіки та логіки обробки виключень.
  3. Відсутність узгодженості: Без глобальної стратегії обробки виключень легко можна упустити обробку певних виключень, що створює потенційні ризики для системи. Наприклад, деякі виключення можуть залишитися не обробленими, що призведе до помилок.

Основна ідея єдиного механізму обробки виключень

Щоб вирішити вищезгадані проблеми, можна застосувати єдиний механізм обробки виключень. Його основна ідея полягає в тому, щоб захоплювати та класифікувати виключення через глобальний обробник виключень, зменшуючи явну логіку захоплення виключень у коді та дозволяючи розробникам зосередитися на реалізації бізнес-логіки.

Кроки реалізації

  1. Налаштування глобального обробника виключень: Спочатку потрібно налаштувати глобальний обробник виключень у фреймворку. Візьмемо фреймворк Webman як приклад, це можна зробити у файлі config/exception.php:
return [  
 '' => support\exception\TinywanHandler::class, // Встановіть глобальний клас обробки виключень  
];

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

  1. Налаштування власного обробника виключень: Далі реалізуємо власний обробник виключень TinywanHandler, який наслідує від Webman\Exception\ExceptionHandler і перевизначає метод render:
class TinywanHandler extends ExceptionHandler {  
 public function render(Request $request, Throwable $exception): Response {  
 $statusCode = 500;  
 $errorMessage = 'Internal Server Error';  
 // Встановіть код статусу та повідомлення про помилку згідно типу виключення  
 if ($exception instanceof BusinessException) {  
 $statusCode = 400;  
 $errorMessage = $exception->getMessage();  
 }  
 $response = [  
 'code' => $statusCode,  
 'message' => $errorMessage,  
 ];  
 return new Response($statusCode, ['Content - Type' => 'application/json'], json_encode($response));  
 }  
}
  1. Класифікація та обробка виключень: Для обробки специфічних виключень TinywanHandler можна розширити, додавши логіку класифікації для різних виключень:
protected function solveExtraException(Throwable $e): void {  
 if ($e instanceof ForbiddenHttpException) {  
 $this->statusCode = 403;  
 $this->errorMessage = 'Forbidden Access';  
 } elseif ($e instanceof BadRequestHttpException) {  
 $this->statusCode = 400;  
 $this->errorMessage = 'Bad Request';  
 } elseif ($e instanceof BusinessException) {  
 $this->statusCode = 422;  
 $this->errorMessage = 'Business Logic Error';  
 }  
}
  1. Налагодження та ведення журналів: У режимі налагодження можна повернути детальну інформацію про помилки, щоб допомогти розробникам знаходити проблеми:
protected function addDebugInfoToResponse(Throwable $e): void {  
 if (config('app.debug', false)) {  
 $this->responseData['trace'] = $e->getTrace();  
 }  
}

Переваги єдиної обробки виключень

  1. Зниження надмірності коду: Відсутність повторюваних блоків try...catch в кожному методі знижує витрати на обслуговування коду.
  2. Покращення зручності для читання: Код стає більш прозорим, оскільки обробка виключень централізована в одному місці.
  3. Підвищення узгодженості: Усі виключення обробляються відповідно до єдиної стратегії, що знижує ризик невиявлених помилок.
    Зменшення надмірності коду Завдяки глобальному захопленню та обробці виключень, повторювані блоки try - catch усуваються, що робить код більш лаконічним.
  4. Покращення зручності для читання коду Логіка обробки виключень відокремлена від бізнес-логіки, що робить структуру коду зрозумілішою. Розробники можуть більше зосередитися на реалізації бізнес-логіки.
  5. Централізоване управління Усі виключення обробляються в одному місці, що полегшує їх модифікацію та розширення. Наприклад, коли додається новий тип виключення, потрібно лише додати відповідну логіку в глобальний обробник.
  6. Легкість у налагодженні та моніторингу Логування, тригеринг сповіщень та інші операції стають більш уніфікованими та стандартизованими, що полегшує вирішення проблем та моніторинг системи.

Висновок

Єдиний механізм обробки виключень — це важливий засіб для покращення якості коду. Він дозволяє розробникам зосередитися на бізнес-логіці, замість того, щоб занурюватися в незначні деталі обробки виключень. Гнучко налаштовуючи та розширюючи обробник виключень, можна знайти баланс між елегантністю та безпекою, що дозволяє ефективніше виконувати завдання розробки.

Перекладено з: Farewell to Tedious Try — Catch! Elegant Exception Handling Solutions

Leave a Reply

Your email address will not be published. Required fields are marked *