понедельник, 17 мая 2010 г.

php обработка ошибок

Как обрабатывать ошибки в php мы можем задать в .ini файлах. 
Уровень у этих директив PHP_INI_ALL (есть исключение для XMLRPC ошибок -- они PHP_INI_SYSTEM)

Директивы можно ставить в рантайм by ini_set, а error_reporting мы можем поставить by error_reporting()


Директивы:
1)
error_reporting = E_ALL & E_STRICT;

если ей поставить  -(минус)1, то будут отображаться все ошибки, даже те которые еще не выделы в отдельный класс и появятся в будущем.

Есть ошибки ядра(E_CORE_*), парсинга(E_PARSE), компиляции(E_COMPILE_*) -- эти ошибки никак нельзя отлавливать и обрабатывать кодом пхп (не факт о E_PARSE), можно только констатировать их факты в логах. А есть юзерские(E_USER_*) их мы можем бросать искуственно by trigger_error(псевдоним user_error). И есть не юзерские, но мы их можем отлавливать и пытаться с ними справиться (E_ERROR, E_WORNING, E_DEPRECATED)

2) error_log -- указываем путь к файлу логов.

3) track_errors -- делает так, что мы в глобальную переменную $php_errormsg попадают ошибки даже от функций с глушением ошибок ( @count(56) ). Мы всегда можем проверить эту переменную и нащупать последнюю ошибку.

и другие директивы...

Функции обработки ошибок

debug_backtrace
 -- возвращает массив обьектов с путем по сработавших функциям от последней, с информацией  о файлах, строках и т.д.

debug_print_backtrace -- распечатывает в удобнов виде трей.

error_get_last -- возвращает массив с уже случившимися ошибками, каждая ошибка описана более подробно чем в функции $php_errormsg(эта переменная строка, а элемент массива тоже массив)

error_log -- отправить ошибки в иной лог чем определено в директиве, может быть другой файл, сокет, на почту и т.д.Это определяется опциональным параметром message_type

set_error_handler 
-- до станадартного обработчика ошибки вызывается наш колбек, если мы хотим, чтобы стандартный вообще не сработал нужно возвратить true с колбека, но нужно помнить, что мы обойдем не только стандартный обработчик, но и продолжим выполнение скрипты с места возникновения ошибки дальше. Поэтому если это недопустимо нужно в колбеке вызвать функцию дай. Чтобы наш собственный обработчик не реагировал на некоторые ошибки(подобно тому как стандартный фильтрируется by error_reporting), мы должны задать опциональную интеджерную маску.

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

restore_error_handler, restore_exception_handler -- востанавливают обработчики, которые стояли до последнего их изменения by set_*_handler
trigger_error(or alias user_error) -- можем сами сгенерировать ошибку типа E_USER_*.

throw $excObj -- а так генерируем собственные исколючения.


Работа с ошибками это подход пхп4, с исключениями - пхп5. Мы можем с легкостью перевести работу ошибок в русло исколючений так:
function exception_error_handler($errno$errstr$errfile$errline ) {
    throw new 
ErrorException($errstr0$errno$errfile$errline);
}
set_error_handler("exception_error_handler");

Это SPL-ный класс, наследник Exception

Комментариев нет:

Отправить комментарий