Важность обработки ошибок в PHP
Обработка ошибок — важнейший аспект разработки программного обеспечения. Чтобы корректно справляться с неожиданными проблемами, в PHP имеются мощные инструменты. Любое исключение в приложении здесь выбрасывается и перехватывается.
Исключения — это непредвиденные ошибки, которые возникают во время выполнения кода при попытке считать несуществующий файл, подключиться к базе данных с некорректными учетными данными, разделить на 0 и т. д. Чтобы не ломать скрипт, их обрабатывают в блоке catch. Это называется обработкой исключений.
Строительные блоки «try/catch»
- Блок
try
содержит код, который выбрасывает исключение. - Блок
catch
содержит код для обработки исключения. - Необязательный блок
finally
содержит код, выполняемый всегда: независимо от того, выбрасывается исключение или нет.
Базовый блок «try/catch»
В PHP блоки 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/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-приложения.
Читайте также:
- Раскройте возможности генераторов PHP
- Продвинутые техники PHP: от шаблонов проектирования до тестирования. Часть 1
- Ключевое слово static в PHP
Читайте нас в Telegram, VK и Дзен
Перевод статьи Erland Muchasaj: PHP: Try and Catch me if you can!