Рассматривать предупреждения как ошибки - PullRequest
13 голосов
/ 15 января 2010

У меня есть приложение php, которое я только что пересмотрел. К сожалению, он издает такие предупреждения, как:

Предупреждение: preg_match () ожидает, что параметр 2 будет строкой, объект указан в /home/yacoby/dev/netbeans/php/Zend/Db/Select.php в строке 776

Что невозможно (или очень тяжелая работа) решить проблему, так как у меня нет стека вызовов, поэтому я не могу определить, какие части моего кода вызывают предупреждение, а кода много.

Мне нужен метод для обработки предупреждений как ошибок (в том случае, если приложение умирает и печатает трассировку стека), или мне нужно, чтобы трассировка стека отображалась при ошибках печати. Есть ли способ сделать это?

Ответы [ 3 ]

22 голосов
/ 15 января 2010

См. Пример № 1 на http://www.php.net/manual/en/class.errorexception.php

<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

/* Trigger exception */
strpos();
?>
9 голосов
/ 15 января 2010

Взгляните на set_error_handler() и включите его в начало ваших сценариев или в свой загрузчик, чтобы просто напечатать трассировку стека при возникновении E_WARNING.

function stacktrace_error_handler($errno,$message,$file,$line,$context)
{
    if($errno === E_WARNING) {
        debug_print_backtrace();
    }
    return false; // to execute the regular error handler
}
set_error_handler("stacktrace_error_handler");

Чтобы лучше контролировать различные типы, взгляните на более явную версию, размещенную в других местах ответов.

4 голосов
/ 15 января 2010

Вы можете определить свой собственный обработчик ошибок, используя set_error_handler ()

В функции-обработчике вы можете обрабатывать каждый класс ошибок по своему усмотрению. Вот базовый шаблон, который я использую, в моем случае я хочу обрабатывать только фатальные ошибки, поэтому игнорирую уведомления и предупреждения.

В вашем случае вы можете отследить предупреждения или записать их в журнал так, как хотите

function error_handler($errno,$message,$file,$line,$context) {

switch($errno) {
    // ignore warnings and notices
    case E_WARNING:
    case E_NOTICE:
    case E_USER_NOTICE:
    case E_USER_WARNING:
        break;
    // log PHP and user errors
    case E_ERROR:
    case E_USER_ERROR:
              // Do some processing on fatal errors
    }
}
...