Ошибки в PHP. Вывод, перехват, скрытие.

Ошибки, могут быть как друзьями программиста так и его врагами. Как говорится у каждой стороны две медали.
Насколько часто вы бьетесь над программой, восклицая про себя: «Чего же ей еще не хватает?!». Помню, когда я был новичком, в самом начале пути познания PHP, у меня это было довольно часто, пока я не научился читать и понимать ошибки. Не стоит воспринимать ошибку как препятствие. Это подсказка для вас. Описание проблемы. Намного легче заниматься отладкой когда, если что-то не работает, видишь ее перед глазами. Поэтому, во время отладки стоит их включать если они отключены. Включаются ошибки достаточно просто. Можно включать их как через .htaaccess так и с помощью самого PHP кода.

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


<?php error_reporting(2047); ?>

что равнозначно тому, если бы вы выводили все ошибки уровня «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

Но это далеко не все. После отладки, нам не надо чтобы пользователь видел ошибки, если они закрались к Вам в код. Для этого мы делаем так:


<?php  error_reporting(0); ?>

Теперь все ошибки не видны пользователю.
Иногда же требуется записывать все ошибки в лог файл, чтобы потом разобраться какие ошибки найдены. Учтите с 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. Первый аргумент данного оператора-имя функции которая должна обработать ошибку. Второй аргумент-уровень ошибки. Приведу пример чтобы было понятнее:


<?php

function myErrorHandler($errno$msg$file$line) {

  
//Если ошибки откл-ничего не делаем. Иначе выводим

  
if (error_reporting() == 0) return;

  echo 
'<div>';

  echo 
"Произошла ошибка:<b>$errno</b>!<br>"

  echo 
"Файл: <tt>$file</tt>, строка $line.<br>";  

  echo 
"Текст ошибки: <i>$msg</i>";    

  echo 
"</div>";

}

set_error_handler("myErrorHandler",E_ALL);

$file file_get_contents('file.txt');

?>

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

Комментарии (5) к “Ошибки в PHP. Вывод, перехват, скрытие.”

Оставить Ответ