В сегодняшнем теоретическом уроке мы рассмотрим сложный и важный вопрос в PHP — выявление и осознание ошибок. Поскольку при создании и программировании скриптов и/или веб-приложений существует большая вероятность появления ошибок, не лишним будет знать коды (константы) ошибок и их описание. Эти возможные ошибки будут приведены для вашего удобства в табличном виде. После ознакомления с данным уроком вы будете лучше понимать запись в логах вида:
[ERROR]: [8][E_NOTICE] [Undefined variable: variable][script.php:1]
Подобный синтаксис сообщения об ошибке можно найти в файлах логов. А в браузере сообщения об ошибке будут несколько похожи: будут включать название файла, номер строки и краткое описание ошибки.
Поскольку PHP имеет много уровней ошибок, для их определения нужно использовать функцию error_reporting(), которая определяет, о каких ошибках вам будет сообщено. Ее можно использовать в конфигурационном файле php.ini или непосредственно в файле текущего скрипта. Ниже показаны некоторые варианты настройки этой функции:
<?php
error_reporting(E_ALL); // включить сообщение обо всех ошибках
ini_set("error_reporting", E_ALL); // другой способ включить сообщения обо всех ошибках
error_reporting(E_ERROR | E_PARSE); // включить сообщение только о серьезных ошибках
error_reporting(E_ALL & ~E_NOTICE); // включить все сообщения, кроме уведомлений
error_reporting(0); // отключить сообщение об ошибках
?>
Некоторые пояснения этой записи:
С каждой сгенерированной ошибкой PHP связан определенный тип. Например, тип ошибки E_NOTICE — это не критическая ошибка времени выполнения или потенциальная ошибка. Чтобы исключить ее показ функцией error_reporting(), используется логический оператор НЕ знаком ~ (тильда) (например ~E_NOTICE). То есть запись по умолчанию E_ALL & ~E_NOTICE означает: все ошибки и не оповещения. Знак & — это логический оператор И, а знак | — это логический оператор ИЛИ. Ниже в таблице вы можете увидеть основные типы ошибок и их описание и обозначение.
| Значение | Константа (код ошибки) | Краткое описание | Есть возможность перехватить? |
| 1 | E_ERROR | Фатальные ошибки времени выполнения. Неустранимая ошибка. Выполнение скрипта прекращается | Нет |
| 2 | E_WARNING | Не фатальные (исправимые) ошибки. Выполнение скрипта не прекращается | Да |
| 4 | E_PARSE | Ошибка парсера на этапе компиляции. Должны генерироваться только парсером | Нет |
| 8 | E_NOTICE | Потенциальная ошибка. Уведомления времени выполнения. Указывают на то, что произошло что-то, что может указывать на ошибку | Да |
| 16 | E_CORE_ERROR | Аналогично ошибке E_ERROR, но генерируется ядром PHP | Нет |
| 32 | E_CORE_WARNING | Предупреждения (не фатальные ошибки), — аналогично E_WARNING, но генерируется ядром PHP | Нет |
| 64 | E_COMPILE_ERROR | Фатальные ошибки на этапе компиляции, — аналогично E_ERROR, но генерируется движком Zend Engine | Нет |
| 128 | E_COMPILE_WARNING | Предупреждения на этапе компиляции (не фатальные ошибки), — аналогично E_WARNING, но генерируется движком Zend Engine | Нет |
| 256 | E_USER_ERROR | Сообщения об ошибках, сгенерированные пользователем, — аналогично E_ERROR, но инициируется вызовом функции trigger_error() | Да |
| 512 | E_USER_WARNING | Предупреждения, сгенерированные пользователем, — аналогично E_WARNING, но инициируется вызовом функции trigger_error() | Да |
| 1024 | E_USER_NOTICE | Уведомления, сгенерированные пользователем, — аналогично E_NOTICE, но инициируется вызовом функции trigger_error() | Да |
| 2048 | E_STRICT | Сообщения от исполнительной среды с рекомендациями по улучшению качества кода, что позволит обеспечить лучшее взаимодействие и совместимость кода | — |
| 4096 | E_RECOVERABLE_ERROR | Опасная, но не фатальная ошибка (например, несоответствие типа). Такие ошибки указывают, что, вероятно, возникла опасная ситуация, но обработка скриптов стабильна. Если ошибка не обрабатывается функцией, выполнение приложения прерывается | Да |
| 8192 | E_DEPRECATED | Предупреждение об использовании устаревшей функции или конструкции. Включается для того, чтобы вы были предупреждены о коде, который не будет работать в будущих версиях PHP | Да |
| 16384 | E_USER_DEPRECATED | Предупреждение об использовании устаревшей функции или конструкции, инициированное в коде скрипта пользователем, с помощью PHP функции trigger_error() | Да |
| 32767 | E_ALL | Все поддерживаемые ошибки, предупреждения и замечания | Нет |
Стандартным обработчиком ошибок для PHP является встроенный обработчик. Но можно изменить обработчик ошибок, чтобы использовать свой специальный обработчик ошибок с помощью функции set_error_handler(). Те ошибки, которые обозначены в таблице как такие, которые возможно перехватить, могут обрабатываться вашей кастомной функцией обработки ошибок. Другие ошибки более сложны и серьезны и должны решаться PHP.
На сегодня все, спасибо за внимание!
WordPress годами был непревзойденным "монолитом": он отвечал и за удобную админ-панель, и за хранение данных,…
В мире веб-серверов часто говорят о противостоянии Nginx vs Apache. Но что, если бы я…
Когда я начинал свой путь в веб-разработке, вопрос "какой веб-сервер использовать?" практически не стоял. Ответ…
Когда речь заходит о веб-серверах, два имени всегда на слуху: Apache и Nginx. Apache —…
В мире веб-разработки мы постоянно сталкиваемся с проблемой: "А у меня на компьютере все работает!".…
На заре моей карьеры веб-разработчика все было относительно просто: установил локальный сервер (помните Denwer?), положил…