Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Как заставить PHP выбрасывать исключения вместо выведения предупреждений


Автор: Royan 25.7.2007, 09:49
Это довольно просто. Разумеется вы можете легко расширить эту функцию, добавив условия для других классов ошибок.
Код

<?php
function error_handler($errorType, $message)
{
        if ($errorType == E_NOTICE) {
                throw new Exception( $message, $errorType);
        }
}

set_error_handler('error_handler');

// Throws a notice
echo $new;
?>

Автор: SamDark 6.8.2007, 10:47
Следует отметить, что не все ошибки могут быть обработаны...

Автор: Fally 7.8.2007, 14:36
Кроме FATAL, PARSE и ... (не помню (: )

Автор: redlinesoft 17.8.2007, 22:40
А конструкция try-catch не катит?

Автор: sergejzr 29.8.2007, 14:17
А как обработать все ошибки? (Вообще, меня интересует логгинг ошивок в файл).
И вопрос 2, вышеописанным способом ловятся даже ошибки, спрятянные оператором @. Как бы их отфильтровать?

Автор: sTa1kEr 29.8.2007, 15:00
Цитата(sergejzr @  29.8.2007,  14:17 Найти цитируемый пост)
А как обработать все ошибки?

Фатальные ошибки можно обработать методом Котерова http://dklab.ru/lib/PHP_CodeFilter/ . Синтаксические... только если перед инклюдом отдельно проверять синтаксис. К примеру через отдельный вызов интерпретатора
Код

$out = `php -l $fileName`;
// Далее парсим $out на наличие ошибок


Цитата(sergejzr @  29.8.2007,  14:17 Найти цитируемый пост)
Вообще, меня интересует логгинг ошивок в файл

А чем не устраивает стандартные логи ошибок PHP?

Цитата(sergejzr @  29.8.2007,  14:17 Найти цитируемый пост)
И вопрос 2, вышеописанным способом ловятся даже ошибки, спрятянные оператором @. Как бы их отфильтровать? 

Способ только один - проверять значение настройки "error_reporting". При возникновении ошибки в выражении с @, это значение всегда будет равняться 0.
Код

function error_handler($errorType, $message)
{
   if (ini_get("error_reporting") == 0) return;
   // ...
}

Или же еще лучше сверять его с текущим типом ошибки
Код

function error_handler($errorType, $message)
{
   if ((ini_get("error_reporting") & $errorType) != $errorType) return;
   // ...
}

Автор: sergejzr 29.8.2007, 15:35
понятно, огромное спасибо! А про стандартные логи я если честно даже не знал, но это не подойдёт, потому что нужны спецнастройки ПХП.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)