Работали ли вы с конструкцией try-catch в PHP?

«Работали ли вы с конструкцией try-catch в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, постоянно использую try-catch для обработки исключений в PHP. Это основной механизм для контроля ошибок в коде, который может завершиться неудачно, например, при работе с файлами, внешними API или базами данных.

Пример обработки исключения при работе с файлом:

try {
    $file = fopen('config.json', 'r');
    if ($file === false) {
        throw new RuntimeException('Не удалось открыть файл конфигурации.');
    }
    $content = fread($file, filesize('config.json'));
    $config = json_decode($content, true);
} catch (RuntimeException $e) {
    // Ловим конкретное исключение
    error_log('Runtime Error: ' . $e->getMessage());
    $config = []; // Возвращаем конфиг по умолчанию
} catch (Exception $e) {
    // Ловим все остальные исключения
    throw new Exception('Критическая ошибка конфигурации: ' . $e->getMessage());
} finally {
    // Этот блок выполнится в любом случае
    if (isset($file) && is_resource($file)) {
        fclose($file);
    }
}

Ключевые моменты из практики:

  • Типизация исключений: Начиная с PHP 7.1, можно ловить несколько типов исключений в одном блоке catch (RuntimeException | InvalidArgumentException $e). Это делает код чище.
  • Throwable: В PHP 7+ все ошибки и исключения реализуют интерфейс Throwable. Поэтому для перехвата любых фатальных ошибок (кроме некоторых, вроде памяти) можно использовать catch (Throwable $e).
  • Без переменной: В PHP 8.0+ можно опустить переменную исключения, если она не нужна: catch (RuntimeException) {}.
  • Вложенность: Исключения можно выбрасывать заново (throw $e;) внутри catch или finally блока для проброса наверх по стеку вызовов.