Пример PHP Try Catch: руководство по обработке исключений и ошибок

⚡ Умное резюме

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

  • ⚠️ Ошибка против исключения: Ошибка, как правило, необратима, тогда как исключение — это неожиданный результат, который программа может перехватить и обработать.
  • 🛡️ Почему стоит использовать: Обработка ошибок предотвращает появление некорректного вывода, защищает пользователей и исключает утечку информации, которую могут использовать злоумышленники.
  • 🛑 Формулировки штампов: Функция die выводит сообщение и останавливает выполнение скрипта — это быстрый способ остановить выполнение при возникновении ошибки.
  • 🇧🇷 Пользовательские обработчики: Функция set_error_handler() перенаправляет ошибки в вашу собственную функцию, позволяя вам записывать, отправлять по электронной почте или форматировать сообщения по своему усмотрению.
  • 📢 Отчет об ошибках: Функции error_reporting() и уровни, такие как E_ALL, контролируют, какие предупреждения и уведомления отображает PHP, что полезно во время разработки.
  • 🧲 Попробуй, брось, поймай: Блок try выполняет рискованный код, throw генерирует исключение, а catch обрабатывает его с помощью методов объекта исключения.
  • 🤖 AI-помощь: Инструменты искусственного интеллекта могут добавить обработку конструкции try-catch в существующий код и объяснить запутанную структуру стека. trace или сообщение об ошибке.

Обработка ошибок и исключений в PHP

Что такое исключение?

Ошибка — это неожиданный результат программы, который не может быть обработан самой программой.

Ошибки устраняются исправлением программы. Примером ошибки может быть бесконечный цикл, который никогда не прекращает выполнение.

Исключение — это неожиданный результат выполнения программы, который может быть обработан самой программой.

Примером исключения может служить попытка открыть файл, которого не существует.

Это исключение можно обработать, создав файл или предоставив пользователю возможность поиска файла.

Зачем обрабатывать исключения?

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

Обработка ошибок PHP

При возникновении ошибки, в зависимости от настроек конфигурации, PHP отображает сообщение об ошибке в веб-браузере с информацией о произошедшей ошибке.

PHP предлагает несколько способов обработки ошибок. Мы рассмотрим три наиболее часто используемых метода:

  1. Заявления о смерти – Функция die объединяет функции echo и exit в одну. Она очень полезна, когда нам нужно вывести сообщение и остановить выполнение скрипта при возникновении ошибки.
  2. Пользовательские обработчики ошибок – это определяемые пользователем функции, которые вызываются при возникновении ошибки.
  3. Отчеты об ошибках PHP – Сообщение об ошибке зависит от настроек отображения ошибок PHP. Этот метод очень полезен в среде разработки, когда вы не знаете, что вызвало ошибку. Отображаемая информация может помочь вам в отладке приложения.

Примеры обработки ошибок

Рассмотрим теперь несколько простых примеров с процедурами обработки ошибок.

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

Код ниже реализует приведенный выше пример.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

Предположим, вы сохранили файл simple_error.php в папке phptuts. Откройте его. URL http://localhost/phptuts/simple_error.php

Вы получите следующие результаты.

Обработка ошибок PHP

Как видно из приведенных выше результатов, наше приложение выглядит непрофессионально и может раздражать пользователя.

Мы изменим приведенный выше код и напишем обработчик ошибок для приложения.

<?php
$denominator = 0;
if ($denominator != 0) {
echo 2 / $denominator;
} else {
echo "cannot divide by zero (0)";
}
?>

Предположим, вы сохранили приведенный выше код как error_handling.php, откройте его. URL http://localhost/phptuts/error_handling.php

Обработчик исключений PHP в PHP

Примечание: В целях безопасности рекомендуется отображать сообщение, подобное показанному выше, вместо обычного сообщения типа «Файл не найден».

Рассмотрим еще один пример, в котором используется пользовательский обработчик ошибок.

Пользовательский обработчик ошибок будет установлен в качестве функции обработки ошибок PHP по умолчанию и будет отображать номер ошибки и сообщение.

Код ниже иллюстрирует реализацию приведенного выше примера.

<?php
function my_error_handler($error_no, $error_msg)
{
echo "Oops, something went wrong:";
echo "Error number: [$error_no]";
echo "Error Description: [$error_msg]";
}
set_error_handler("my_error_handler");
echo (5 / 0);
?>

Откройте приложение URL http://localhost/phptuts/custom_error_handler.phpВ результате вы получите следующие данные.

Обработка ошибок PHP

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

  • Они позволяют нам настраивать сообщения об ошибках.
  • Пользовательский обработчик ошибок также может включать запись ошибок в файл или базу данных, отправку электронного письма разработчику и аналогичные действия.

Теперь рассмотрим третий тип обработки ошибок. Мы будем использовать встроенную в PHP функцию error_reporting. Она имеет следующий базовый синтаксис.

<?php
error_reporting($reporting_level);
?>

ВОТ,

  • «error_reporting» — функция сообщения об ошибках PHP.
  • Параметр «$reporting_level» является необязательным и может использоваться для установки уровня отчетности. Если уровень отчетности не указан, PHP будет использовать уровень отчетности об ошибках по умолчанию, указанный в файле php.ini.
Уровень отчетности Описание Пример
E_WARNING Отображает только предупреждающие сообщения. Не останавливает выполнение скрипта error_reporting (E_WARNING);
E_NOTICE Отображает уведомления, которые могут возникнуть во время нормального выполнения программы или могут быть ошибками. error_reporting(E_NOTICE);
E_USER_ERROR Отображает ошибки, сгенерированные пользователем, то есть пользовательский обработчик ошибок. error_reporting(E_USER_ERROR);
E_USER_WARNING Отображает созданные пользователем предупреждающие сообщения error_reporting (E_USER_WARNING);
E_USER_NOTICE Отображает уведомления, созданные пользователем error_reporting (E_USER_NOTICE);
E_RECOVERABLE_ERROR Отображает ошибки, которые не являются критическими и могут быть обработаны с помощью пользовательских обработчиков ошибок. error_reporting (E_RECOVERABLE_ERROR);
E_ALL Отображает все ошибки и предупреждения error_reporting (E_ALL);

Разница между ошибками и исключениями

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

В таблице ниже показаны методы объекта исключения.

Способ доставки Описание Пример
GetMessage () Отображает сообщение об исключении
<?php
echo $e->getMessage();
?>
получитьCode() Отображает числовой код, обозначающий исключение.
<?php
echo $e->getCode();
?>
получить файл() Отображает имя файла и путь, где произошло исключение.
<?php
echo $e->getFile();
?>
getLine () Отображает номер строки, в которой произошло исключение
<?php
echo $e->getLine();
?>
получитьTracе () Отображает массив задних стенок.trace перед исключением
<?php
print_r( $e->getTrace());
?>
getPrevious () Отображает предыдущее исключение перед текущим
<?php
echo $e->getPrevious();
?>
получитьTraceAsString() Отображает заднюю частьtrace исключения в виде строки, а не массива.
<?php
echo $e->getTraceAsString();
?>
__нанизывать() Отображает все исключение в виде строки
<?php
echo $e->__toString();
?>

Ниже приведен основной синтаксис для создания исключения.

<?php
throw new Exception("This is an exception example");
?>

ВОТ,

  • «throw» — ключевое слово, используемое для создания исключения
  • Метод “new Exception(…)” создает объект исключения и передает строку “This is an exception example” в качестве параметра сообщения.

Приведенный выше код выводит следующее сообщение.

Обработчик исключений PHP в PHP

Теперь рассмотрим пример, реализующий исключения throw и catch. Мы изменим приведенный выше пример и добавим конструкции try, throw и catch.

Он имеет следующий базовый синтаксис.

<?php
try {
// code goes here that could potentially throw an exception
}
catch (Exception $e) {
// exception handling code goes here
}
?>

ВОТ,

  • «try{…}» — это выполняемый блок кода, который потенциально может вызвать исключение.
  • «catch(Exception $e){…}» — это блок кода, который перехватывает выброшенное исключение и присваивает объект исключения переменной $e.

Приведённый ниже код демонстрирует базовый пример обработки исключений с использованием конструкций try, throw и catch. Программа намеренно генерирует исключение, которое затем перехватывает.

<?php
try {
$var_msg = "This is an exception example";
throw new Exception($var_msg);
}
catch (Exception $e) {
echo "Message: " . $e->getMessage();
echo "";
echo "getCode(): " . $e->getCode();
echo "";
echo "__toString(): " . $e->__toString();
}
?>

Откройте приложение URL http://localhost/phptuts/exception_handling.phpВ результате вы получите следующие данные.

Обработчик исключений PHP в PHP

Также можно создать несколько исключений для одного оператора try в PHP в зависимости от типа выбрасываемого исключения.

Смотрите статью на MySQLДоступ к данным в PHP для примеров реализации обработки множественных исключений.

Множественные исключения

Использование множественных исключений предполагает применение нескольких блоков catch для обработки выброшенных исключений. Множественные исключения полезны в следующих случаях:

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

Приведенная ниже блок-схема иллюстрирует принцип работы множественных исключений.

Множественные исключения

Рассмотрим пример, использующий несколько исключений. Мы изменим код, который делит число на переданный знаменатель.

Мы ожидаем возникновения двух типов исключений:

  • Деление на ноль
  • Деление на отрицательное число

Для простоты мы будем отображать тип исключения только в блоках catch. Для генерации исключений используется встроенный в PHP класс Exception. Мы создадим два класса, которые расширяют класс Exception, и будем использовать их для генерации исключений.

Код ниже демонстрирует реализацию.

<?php
class DivideByZeroException extends Exception {};
class DivideByNegativeException extends Exception {};
function process($denominator)
{
try
{
if ($denominator == 0)
{
throw new DivideByZeroException();
}
else if ($denominator < 0)
{
throw new DivideByNegativeException();
}
else
{
echo 25 / $denominator;
}
}
catch (DivideByZeroException $ex)
{
echo "DIVIDE BY ZERO EXCEPTION!";
}
catch (DivideByNegativeException $ex)
{
echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!";
}
catch (Exception $x)
{
echo "UNKNOWN EXCEPTION!";
}
}
process(0);
?>

Тестирование кода

Предположим, вы сохранили файл multiple_exceptions.php в папке phptuts.

Перейдите к URL http://localhost/phptuts/multiple_exceptions.php

Обработчик исключений PHP в PHP

Вернитесь к файлу PHP и передайте -1 в качестве параметра, как показано на следующей диаграмме.

Обработчик исключений PHP в PHP

Перейдите к URL http://localhost/phptuts/multiple_exceptions.phpКакие результаты вы получите? Теперь передайте 3 в качестве параметра. Какие результаты вы получите?

Блок «И наконец» и модель ошибок PHP 7

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

Начиная с PHP 7, многие прежние фатальные ошибки теперь выбрасываются в виде объектов Error. И Exception, и Error реализуют интерфейс Throwable, поэтому блок catch (\Throwable $e) может обрабатывать любой из них.

<?php
try {
$result = 10 / 0;
} catch (DivisionByZeroError $e) {
echo "Caught: " . $e->getMessage();
} finally {
echo "This message always runs";
}
?>

В PHP 8 деление на ноль вызывает ошибку DivisionByZeroError, блок catch сообщает об этом, а блок finally всегда выполняется, выводя свое сообщение независимо от того, произошла ошибка или нет.

Часто задаваемые вопросы (FAQ)

В рабочей среде установите display_errors в значение Off и log_errors в значение On в файле php.ini и укажите error_log путь к файлу. Вы также можете вызвать error_log('message') для записи пользовательских записей, не раскрывая ничего посетителям.

Конструкция try-catch обрабатывает исключения, генерируемые с помощью ключевого слова throw. Функция set_error_handler перехватывает традиционные ошибки и предупреждения PHP. В PHP 7 и более поздних версиях многие ошибки, существовавшие ранее, также генерируются в виде объектов Error, которые можно перехватывать.

Необработанное исключение перерастает в фатальную ошибку, останавливает выполнение скрипта и выводит сообщение об ошибке "Uncaught Exception" с данными из стека. trace. Глобальный обработчик, настроенный с помощью set_exception_handler, может перехватывать такие исключения в крайнем случае.

Да. Искусственный интеллект может заключать рискованные операции в блоки try-catch, выбирать правильные типы исключений, добавлять блок finally для очистки и регистрировать ошибку. RevОбратите внимание, что он не игнорирует исключения, которые вам необходимо проверить.

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

Подведем итог этой публикации следующим образом: