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, в котором исключение всегда сгенерировано (только ради примера):
- Внутри блока TRY мы проверяем, равняется ли цифра 1 цифре 2. Так как она не равняется (и никогда не будет равняться), мы генерируем исключение с сообщением “1 не равняется 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 мы генерируем исключение тогда, когда не можем открыть запрашиваемый файл. И генерируем мы его, так как файл должен был существовать. Примеры ситуаций, когда вы можете генерировать исключения:
- Ваше PHP-приложение не может подключиться к MySQL;
- Ошибка при запросе к базе данных;
- Ошибка при запросе к API;
- Получен некорректный тип запроса;
- Отсутствуют необходимые переменные $_POST или $_GET.
Нужно ли перехватывать все исключения?
Лично я так не считаю. К примеру: вам не удается подключиться к базе данных, и генерируется исключение, нужно ли тогда исполнять весь оставшийся код? Если весь последующий код привязан к базе данных, которой просто не существует, то зачем же его исполнять?
По моему мнению, исключения нужно перехватывать с помощью PHP try catch finally только, если это не оказывает негативного влияния на остальные функции приложения.
Например: если API-запрос к внешнему сервису выдает ошибку, то вы можете перехватить исключение и вывести дружественное пользователю сообщение «Невозможно подключиться к базе данных» или «Информация о погоде недоступна».
Не перехваченные исключения следует обрабатывать с помощью пользовательского обработчика. Так вы сможете обрабатывать не перехваченные исключения, и выводить понятные человеку сообщения или заглушки.