Работали ли вы с конструкцией try-catch в 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 блока для проброса наверх по стеку вызовов.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Конечно, постоянно юзаю try-catch, без этого никуда. Это ж как подушка безопасности в коде — когда всё летит в тартарары, а ты сидишь и спокойно кофе пьёшь, потому что ошибку уже поймал и обработал.

Вот смотри, как обычно выглядит моя возня с файлами, от которой волнение ебать начинается:

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, если что, можно в один catch несколько типов запихнуть — catch (RuntimeException | InvalidArgumentException $e). Код сразу чище становится, не надо эту ебанько с кучей одинаковых блоков разводить.
  • Throwable: В том же PHP 7 все ошибки и исключения — они теперь Throwable. Так что если хочешь перехватить вообще почти всё, что летит, лови его. Почти всё — потому что от нехватки памяти, блядь, не спасёт, тут уж извини.
  • Без переменной: Восьмой PHP вообще красава — если тебе сама ошибка нахуй не сдалась, а важно только что она случилась, можешь переменную не писать: catch (RuntimeException) {}. Удобно, когда просто логируешь факт.
  • Вложенность: Самое интересное — исключение можно, поймав, выбросить обратно (throw $e;). И в catch, и в finally можно. Это когда ты на своём уровне сделал что мог, а дальше пусть начальство разбирается, ебать копать. Пробрасываешь наверх по стеку вызовов, и пусть там голову ломают.

В общем, без этого механизма писать — это как ходить по охуенно тонкому льду. Один неверный шаг, и ты уже в ледяной воде, а весь твой код — накрылся медным тазом.