PHP: поймай меня, если сможешь

Важность обработки ошибок в PHP

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

Исключения  —  это непредвиденные ошибки, которые возникают во время выполнения кода при попытке считать несуществующий файл, подключиться к базе данных с некорректными учетными данными, разделить на 0 и т. д. Чтобы не ломать скрипт, их обрабатывают в блоке catch. Это называется обработкой исключений.

Строительные блоки «try/catch»

  • Блок try содержит код, который выбрасывает исключение.
  • Блок catch содержит код для обработки исключения.
  • Необязательный блок finally содержит код, выполняемый всегда: независимо от того, выбрасывается исключение или нет.

Базовый блок «try/catch»

В PHP блоки try и catch  —  это способ корректной обработки исключений с предоставлением пользователям информативной обратной связи.

Начнем с простого примера:

Простой блок «try/catch»

Обертываете любую часть кода, где, по-вашему, выбросится ошибка, и обрабатываете ее в блоке catch.

Конечно, любая ошибка выбрасывается и вручную  —  с помощью ключевого слова throw.

Обработка нескольких исключений

Бывает, что оператор try содержит несколько блоков catch, каждый из которых обрабатывает конкретный тип ошибок.

Последовательность исключений здесь от конкретного к общему. Последний блок catch содержит код для обработки самого общего исключения.

Так оператор try...catch перехватывает все исключения:

Обработка нескольких исключений

В PHP 8 появились типы-объединения, которые позволяют указывать, что параметр или возвращаемое значение должно быть одного из нескольких типов. Этот функционал очень полезен при обработке нескольких исключений.

Обработка нескольких исключений с типами-объединениями

В этом примере перехватываются либо ArgumentCountError, либо DivisionByZeroError, либо Exception. Применяя в работе с различными исключениями типы-объединения, вы создаете код чище и лаконичнее.

Блок «finally»

Кроме try и catch, в PHP имеется блок finally. Код в нем выполняется всегда независимо от того, выброшено исключение или нет. Особенно полезен он для задач очистки.

Последний обработчик выполнится всегда

Блок finally гарантированно освобождает ресурсы, закрывает подключения или выполняет любые необходимые операции очистки, что бы ни происходило в блоках try и catch.

Исключения без обработки ошибок

Начиная с версии PHP 8.0, название переменной для перехваченного исключения необязательно, его можно опустить, как здесь:

Блок «try» без обработки исключений

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

Осторожно!

Когда исключения ошибок обрабатываются в функции, также имеются try/catch/finally, будьте внимательны к возвращаемому типу:

<?php

function handleException(): string
{

try {
throw new Exception('Hello World');
} catch (Exception $e) {
return 'caught';

} finally {
return 'finally';
}

return 'Finished';
}

echo handleException(); // => finally

Finally выполнится всегда, даже если внутри catch имеется return или снова выбрасывается ошибка. Последний блок выполнится, а последняя часть вне try catch  —  нет.

Внимание: это применимо только при возвращении из блока finally{}.

/**
* @throws Exception
*/
function handleException(): void
{

try {
throw new Exception('Hello World');
} catch (Exception $e) {
echo 'Caught, ';

} finally {
echo 'Finally, ';
}

echo 'Finished, ';
}



echo handleException(); // => Перехвачено наконец, завершено.

В этом случае все блоки выполнятся.

Заключение

Обработка исключений  —  важный навык для разработчиков PHP. Блоки try, catch, finally, типы-объединения  —  это надежные механизмы управления ошибками и исключениями в коде. Следуя рекомендациям и изучая продвинутые техники, вы создадите более надежные и сопровождаемые PHP-приложения.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Erland Muchasaj: PHP: Try and Catch me if you can!

Предыдущая статья7 стратегий ускорения приложений React Native
Следующая статьяОсваиваем ViewThatFits. Часть 2