Ошибки в PHP. Вывод, перехват, скрытие.
Ошибки, могут быть как друзьями программиста так и его врагами. Как говорится у каждой стороны две медали.
Насколько часто вы бьетесь над программой, восклицая про себя: «Чего же ей еще не хватает?!». Помню, когда я был новичком, в самом начале пути познания PHP, у меня это было довольно часто, пока я не научился читать и понимать ошибки. Не стоит воспринимать ошибку как препятствие. Это подсказка для вас. Описание проблемы. Намного легче заниматься отладкой когда, если что-то не работает, видишь ее перед глазами. Поэтому, во время отладки стоит их включать если они отключены. Включаются ошибки достаточно просто. Можно включать их как через .htaaccess так и с помощью самого PHP кода.
Для включения ошибки через PHP стоит использовать функцию error_reporting. Параметром для данной функции является уровень ошибки. Т.е. вы можете выводить все ошибки, поставив в начале вашего скрипта:
|
что равнозначно тому, если бы вы выводили все ошибки уровня «E_ALL». Ниже я привожу честно скопипастенное из мануала описание уровней ошибок.
| Значение | Константа | Описание | Примечание |
|---|---|---|---|
| 1 | E_ERROR |
Фатальные ошибки времени выполнения. Указывает на ошибки, которые не могут быть устранены, такие как проблемы выделения памяти. Выполнение скрипта останавливается. |
|
| 2 | E_WARNING | Предупреждения времени выполнения (нефатальные ошибки). Выполнение скрипта не останавливается. | |
| 4 | E_PARSE | Ошибки разбора при компиляции. Ошибки разбора должны генерироваться только разборщиком. | |
| 8 | E_NOTICE |
Уведомления времени выполнения. При работе скрипта возникло нечто, что может указывать на ошибку, но может также появиться и при нормальном выполнении скрипта. |
|
| 16 | E_CORE_ERROR | Фатальные ошибки, возникающие при начальном старте РНР. Напоминает E_ERROR, но генерируется ядром PHP. | Впервые с PHP 4 |
| 32 | E_CORE_WARNING | Предупреждения (нефатальные ошибки), возникающие при начальном старте РНР. Напоминает E_WARNING, но генерируется ядром PHP. | Впервые с PHP 4 |
| 64 | E_COMPILE_ERROR |
Фатальные ошибки компиляции. Напоминает E_ERROR, но генерируется машиной Zend Scripting Engine. |
Впервые с PHP 4 |
| 128 | E_COMPILE_WARNING |
Предупреждения времени компиляции (нефатальные ошибки). Напоминает E_WARNING, но генерируется машиной Zend Scripting Engine. |
Впервые с PHP 4 |
| 256 | E_USER_ERROR | Генерируемое пользователем сообщение об ошибке. Напоминает E_ERROR, но генерируется в РНР-коде путём использования РНР-функции trigger_error(). | Впервые с PHP 4 |
| 512 | E_USER_WARNING | Генерируемое пользователем предупреждение. Напоминает E_WARNING, но генерируется в РНР-коде путём использования РНР-функции trigger_error(). | Впервые с PHP 4 |
| 1024 | E_USER_NOTICE | Генерируемое пользователем уведомление. Напоминает E_NOTICE, но генерируется в РНР-коде путём использования РНР-функции trigger_error(). | Впервые с PHP 4 |
| 2047 | E_ALL | Все ошибки и предупреждения, если поддерживаются, за исключением уровня E_STRICT. | |
| 2048 | E_STRICT | Примечания во время выполнения. Включите, чтобы PHP, предлагал замены вашему коду, который будет гарантировать лучшую функциональную совместимость и совместимость вашего кода с предыдущими версиями PHP. | Впервые с PHP 5 |
Но это далеко не все. После отладки, нам не надо чтобы пользователь видел ошибки, если они закрались к Вам в код. Для этого мы делаем так:
|
Теперь все ошибки не видны пользователю.
Иногда же требуется записывать все ошибки в лог файл, чтобы потом разобраться какие ошибки найдены. Учтите с error_reporting(0) вы не увидите никаких ошибок в логе. Ибо PHP просто не будет сообщать о них.
Возможность записи в лог можно легко организовать с помощью htaccess.
Делается это примерно так:
php_value log_errors "on"
php_value log_errors_max_len "1024"
php_value error_log "/home/phpbegun.ru/error.log"
Таким образом в первой строке мы включаем лог ошибок в PHP. Ограничиваем его длину одним мегабайтом (чтобы не загадить все место на серваке), ну и указываем абсолютный путь до файла в который пишем логи.
Я рассказал о записи в лог, отключении и "насильственном" выводе ошибок. Теперь перейду к последнему пункту: перехвату ошибок.
Часто требуется чтобы ошибки обрабатывались некой функцией (например написанной нами). Для этого существует спциальные "перехватчик" ошибок: set_error_handler. Первый аргумент данного оператора-имя функции которая должна обработать ошибку. Второй аргумент-уровень ошибки. Приведу пример чтобы было понятнее:
|
Если файла не существует будет выведена ошибка. Попробуйте сами.
Вот собственно и все что я хотел описать в данной статье. Надеюсь, она поможет вам делать более качественные веб приложения, с меньшим количеством глюков..или, хотя бы, с глюками невидимыми пользователям.
у вас интересные статьи, но «неинтересная» рассылка. возможно если вы добавили РСС возможность, было бы намного просче следить за вашим саитом.
ПС извеняюс за ошибки, они неспециалные (translit)
Есть RSS http://phpbegun.ru/feed/ Скоро буду делать редизайн, тогда и приведу все впорядок. Спасибо, за здоровую критику.
Спасибо, не знал про E_CORE_WARNING и E_CORE_ERROR – а иногда полезно очень
Не хотите продать свой phpbegun.ru ?
Извините, нет.