Try Catch PHP или исключения в PHP

Представляем вашему вниманию руководство для новичков о том, как использовать блоки  Try Catch PHP. В этой статье я покажу, как перехватывать исключения.

Давайте сразу взглянем на пример сгенерированного исключения (и впоследствии перехваченного):

<?php

//Пробуем (try) что-либо сделать.
try{
    //Очевидно, 1 никогда не будет равняться 2...
    if(1 !== 2){
        //Генерируем исключение.
        throw new Exception('1 не равняется 2!');
    }
} 
//Перехватываем (catch) исключение, если что-то идет не так.
catch (Exception $ex) {
    //Выводим сообщение об исключении.
    echo $ex->getMessage();
}

В приведенном выше примере я продемонстрировал использование TRY и CATCH, в котором исключение всегда сгенерировано (только ради примера):

  1. Внутри блока TRY мы проверяем, равняется ли цифра 1 цифре 2. Так как она не равняется (и никогда не будет равняться), мы генерируем исключение с сообщением “1 не равняется 2!”;
  2. Внутри блока CATCH мы перехватываем исключение и выводим соответствующее сообщение.

Выводы:

  • TRY: внутри блока PHP try мы задаем логику приложения. Этот блок содержит код, который может или не может сгенерировать исключение;
  • CATCH: блок CATCH будет перехватывать любые исключения, проявившиеся в предыдущем блоке TRY. Код внутри блока CATCH будет исполнен только в случае обнаружения исключения;
  • FINALLY: если вы используете PHP 5.5 и выше, то вы можете использовать блок FINALLY. Расположенный в нем код исполняется всегда, вне зависимости от того, было ли обнаружено исключение.

Когда используются исключения?

Исключения используются, когда результат операции отличается от того, что ожидало ваше приложение. К примеру, если ваше приложение пытается прочитать CSV-файл на сервере, а этого файла не существует, то можно сгенерировать исключение. Использование PHP try catch в примере:

<?php

//Пробуем (try) что-либо сделать.
try{
    //Попытка открыть CSV-файл.
    $fileHandle = fopen("my_file.csv", "r");
    //Если fopen возвращает логическое значение FALSE, то возникает ошибка.
    if($fileHandle === false){
        throw new Exception('Невозможно открыть CSV-файл!');
    }
} 
//Перехватываем (catch) исключение, если что-то идет не так.
catch (Exception $ex) {
    //Выводим сообщение об исключении.
    echo $ex->getMessage();
}

В приведенном выше примере использования в PHP try exception мы генерируем исключение тогда, когда не можем открыть запрашиваемый файл. И генерируем мы его, так как файл должен был существовать. Примеры ситуаций, когда вы можете генерировать исключения:

  1. Ваше PHP-приложение не может подключиться к MySQL;
  2. Ошибка при запросе к базе данных;
  3. Ошибка при запросе к API;
  4. Получен некорректный тип запроса;
  5. Отсутствуют необходимые переменные $_POST или $_GET.

Нужно ли перехватывать все исключения?

Лично я так не считаю. К примеру: вам не удается подключиться к базе данных, и генерируется исключение, нужно ли тогда исполнять весь оставшийся код? Если весь последующий код привязан к базе данных, которой просто не существует, то зачем же его исполнять?

По моему мнению, исключения нужно перехватывать с помощью PHP try catch finally только, если это не оказывает негативного влияния на остальные функции приложения.

Например: если API-запрос к внешнему сервису выдает ошибку, то вы можете перехватить исключение и вывести дружественное пользователю сообщение «Невозможно подключиться к базе данных» или «Информация о погоде недоступна».

Не перехваченные исключения следует обрабатывать с помощью пользовательского обработчика. Так вы сможете обрабатывать не перехваченные исключения, и выводить понятные человеку сообщения или заглушки.

Валентин Сейидовавтор-переводчик статьи «Php Exceptions: Try & Catch»

Комментарии

Оставьте свой комментарий
А
Андрей

Все исключния нужно обрабытывать. Если ошибка базы данных, то пользователю не будет приятно увидеть ее на своем экране. К тому же использовать исключения просто удобно, их можно отлавливать даже в одном месте, логировать и выводить дружелюбное сообщение об ошибке, либо перенаправлять на 404 страницу. Это удобный инструмент которым, к сожалению не все умеют пользоватся.

БГ
Борис Г.

Здравствуйте! Не до конца понял, зачем использовать try и catch. Ведь можно логикой if else оценить результаты ошибочной операции и вывести пользователю понятные сообщения о том, что именно пошло не так

Д
Дмитрий

В том-то и дело, зачем городить конструкцию try-catch, если if-else можно буквально одной строкой сделать то же самое?
Очевидно, что try-catch должен использоваться в каких-то более сложных моментах.