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

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

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

<?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” был подготовлен дружной командой проекта Сайтостроение от А до Я.

27 марта 2016 в 10:19
Материалы по теме
{"url":"http://www.fastvps.ru/", "src":"/images/advbanners/fastvps.png", "alt":"Хостинг Fastvps.ru. Наш выбор!"}
Заработок