Содержание
В этом кратком совете по созданию отчетов об ошибках PHP мы рассмотрим, как использовать имеющиеся в PHP инструменты для контролируемой обработки ошибок и тем самым сэкономить часы отладки.
PHP, по определению, является языком программирования ”без исключений”. Это означает, что, хотя в нем и есть исключения, он продолжит выполнение любого скрипта, что бы ни случилось, если только не произойдет фатальная ошибка.
Например:
<?php echo $sitepoint;
Приведенный выше код вернет следующее сообщение:
Notice: Undefined variable: sitepoint in PHP shell code on line 1
PHP выдаст только ошибку уведомления и с радостью продолжит выполнение. Язык с большим количеством исключений, например Python, выбросит ошибку и остановит выполнение.
Из-за такого поведения разработчики PHP должны быть особенно внимательны при написании кода. При выполнении программ могут возникнуть неожиданные результаты, поскольку уведомления не остановят выполнение, но могут повлиять на корректное поведение программы.
Прежде чем мы перейдем к настройке стиля сообщения об ошибках в PHP, давайте разберемся в нескольких уровнях серьезности ошибок PHP.
В PHP есть три основных типа сообщений: ошибки, уведомления и предупреждения. Они представляют собой различные уровни серьезности: E_ERROR, E_NOTICE и E_WARNING.
Ошибки являются фатальными ошибками времени выполнения и обычно вызваны ошибками в коде. Это приведет к прекращению выполнения PHP.
Уведомления - это сообщения, вызванные кодом, который может вызвать или не вызвать проблемы (например, неопределенная переменная). Они не приводят к остановке выполнения.
Предупреждения - это не фатальные ошибки, и выполнение сценария не будет остановлено.
Ведение журнала ошибок в PHP
По умолчанию PHP не ведет журнал ошибок. Чтобы это произошло, мы должны специально указать ему начать вести журнал, включив переменную display_errors в файле конфигурации PHP (файл php.ini).
В этом файле мы можем дополнительно указать PHP, хотим ли мы также вести журнал уведомлений и предупреждений, и куда этот журнал должен записываться.
Также есть возможность запускать логирование изнутри кода. Для этого мы можем использовать функцию error_log(). Поскольку логирование ошибок не является основной темой этой статьи, более подробную информацию можно найти здесь.
Изменение отчета об ошибках PHP
Мы можем изменить стандартное поведение PHP в отношении сообщений об ошибках с помощью функции error_reporting(). С помощью этой функции мы можем установить уровень ошибок на время выполнения скрипта. Это делается путем передачи в функцию одной или нескольких предопределенных констант ошибок.
Например, если мы хотим видеть не только ошибки, но и уведомления, мы можем использовать следующее:
<?php error_Reporting(E_ERROR | E_NOTICE);
При таком объявлении выполнение скрипта будет останавливаться не только при ошибках, но и при уведомлениях.
Подавление ошибок
Мы также можем указать PHP на подавление определенных ошибок с помощью оператора контроля ошибок (@). Если поставить этот оператор в начало выражения, то любая ошибка, являющаяся прямым результатом этого выражения, будет заглушена:
<?php echo @$sitepoint;
Это выведет значение $sitepoint, если оно существует, но вернет NULL и ничего не выведет (вместо того, чтобы бросить уведомление), если его нет.
Будьте очень осторожны при использовании этого оператора, поскольку он полностью скрывает ошибку. Ошибка не только не будет отображаться, но и не будет отправлена в журнал ошибок.
Хотя это может показаться безобидным, используя этот оператор, вы маскируете более глубокие структурные проблемы в коде и скрываете потенциально ошибочное поведение.
PHP как язык с большим количеством исключений
Наконец, PHP можно использовать как язык программирования с большим количеством исключений. Обычные ошибки PHP могут быть отброшены как исключения с помощью класса ErrorException, который расширяет класс PHP Exception.
В следующем примере пользовательская функция errorhandler() устанавливается в качестве обработчика ошибок с помощью функции set_error_handler(). Она выбрасывает ErrorException, когда происходит фатальная ошибка из-за того, что файл не найден функцией file_get_contents():
<?php
function errorHandler($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
return;
}
throw new ErrorException("Fatal Error: No such file or directory", 0, E_ERROR);
}
set_error_handler("errorHandler");
try {
$data = file_get_contents("sitepoint.txt");
echo $data;
} catch (ErrorException $e) {
echo $e->getMessage();
}
Используя этот метод, мы можем обрабатывать ошибки выполнения так же, как мы обрабатываем исключения, оборачивая их в оператор try...catch с соответствующими инструкциями о том, как вести себя в таких ситуациях.
Заключение
Подводя итог, можно сказать, что PHP может обрабатывать ошибки очень небрежно. Мы, разработчики, должны использовать доступные инструменты для лучшей обработки ошибок, чтобы извлечь максимум пользы из языка. Используя этот набор инструментов, мы можем обрабатывать ошибки контролируемым образом, экономя таким образом часы отладки.