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

Zextreo

Новичок
Обработка ошибок

Хочу ослеживать ошибки на своем сайте.
Использовал обработчки ошибок с сайта http://www.spravkaweb.ru/php/managfun/error/userfun.
Возникающие ошибки я сохраняю в файл, НО почему-то у меня сохраняются ошибки которые я экранирую символом @.

Цитата с того сайта:
Заметьте, что код ошибки будет равен 0, если ошибка возникла в функции, вывод ошибок для которой был блокирован оператором "@".
Но в обработчик у меня попадают все ошибки, как будто я их не экранирую, т.е. код ошибки всегда не нулевой.

Например, я часто использую выражения вида:
PHP:
if (@$_GET['action'] == 'set_param') do_func();
Поэтому лог ошибок, содержит много лишней информации.
Почему, при экранировании ошибки символом @, код ошибки не нулевой?
Может сервер не так настроен?

Локальный сервер - Денвер, на хостинге тоже самое.
 

Фанат

oncle terrible
Команда форума
Странное поведение.
Но мне интересно другое. Зачем вообще нужен собственный обработчик ошибок? Какой смысл во всей этой портянке на экране?
Зачем мешать ошибки программы и пользовательские ошибки?

-~{}~ 12.11.08 13:48:

То есть, тут два вопроса
Нафига нужен этот хендлер вообще
И нафига в него триггерами пихать ошибки входных данных - в частности

-~{}~ 12.11.08 14:02:

Сам сайт какой-то бредовый
http://www.spravkaweb.ru/php/managfun - это что? То ли перепечатка мана из прошлого века, то ли доморощенное руководство, столь же ископаемое.

Не надо оттуда ничего брать.
 

Zextreo

Новичок
Та статья - это перевод того, что написано в PHP Munual (set_error_handler). Сайт тот меня не интересует, просто показал, чтобы было более понятно о чем речь.

Вот та же цитаты из руководства по php:
Of particular note is that this value will be 0 if the statement that caused the error was prepended by the @ error-control operator.
Тригерами пользоваться я не собираюсь.

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

Сайт я буду еще долго разратывать и дорабатывать, и такую функцию, как лог ошибок, было бы очень полезно иметь.
 

Zextreo

Новичок
Вот пример обработчика 1.php
PHP:
<?php
set_error_handler('error_handler');
if (@$_GET['action'] == 'test') echo 'test';

function error_handler($errno, $errmsg, $filename, $linenum, $vars)
{   // Пользовательский обработчик ошибок
    $errortype = array(
E_ERROR           => 'Error',
E_WARNING         => 'Warning',
E_PARSE           => 'Parsing Error',
E_NOTICE          => 'Notice',
E_CORE_ERROR      => 'Core Error',
E_CORE_WARNING    => 'Core Warning',
E_COMPILE_ERROR   => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR      => 'User Error',
E_USER_WARNING    => 'User Warning',
E_USER_NOTICE     => 'User Notice',
E_STRICT          => 'Runtime Notice');
    $err = "<error>\n";
    $err .= "\t<date>".date('Y-m-d H:i:s')."</date>\n";
    $err .= "\t<num>".$errno."</num>\n";
    $err .= "\t<type>".$errortype[$errno]."</type>\n";
    $err .= "\t<msg>".$errmsg."</errormsg>\n";
    $err .= "\t<script>".$filename."#".$linenum."</script>\n";
    $err .= "</error>\n\n";

    if (!empty($err))
    {   // Сохранение ошибки
        $f = fopen('data/error_log.txt', 'a');
        fputs($f, $err);
        fclose($f);
    }
}
?>


Содержание файла: error_log.txt
PHP:
<error>
	<date>2008-11-12 13:39:13</date>
	<num>8</num>
	<type>Notice</type>
	<msg>Undefined index:  action</errormsg>
	<script>z:\home\igry\www\1.php#3</script>
</error>
 

dimagolov

Новичок
Zextreo, лог ошибок есть стандартный в php, если хочешь логировать какие-то события кроми ошибок, то пиши их в файлы руками.

нормально написанный код в лог ошибок ничего не выводит даже на E_ALL при практически любых раскладах
 

Zextreo

Новичок
Я знаю что в этом месте возможна ошибка, поэтому я ее экранирую
PHP:
if (@$_GET['action'] == 'test') echo 'test';
Чтобы не экранировать, мне прийдется писать так
PHP:
if (!empty($_GET['action']) and $_GET['action'] == 'test') echo 'test';
А ошибки сложно выявить на всем сайте, я знаю что я их иногда допускаю, и хочу их оперативно устранять.

Например, скачал логи ошибок, увидел что-то не так, сразу же исправил. А так я ее замечаю, только если мне о ней сообщат пользователи либо я сам на нее не наткнусь.

-~{}~ 12.11.08 14:00:

fixxxer "сюрприз-сюрприз"
В настройках можно устранить проблемму?
На какую настройку обратить внимание?
 

fixxxer

К.О.
Партнер клуба
на error_log , log_errors и display_errors. а обработчик можно выкинуть ;)

-~{}~ 12.11.08 15:07:

а собаку юзай осторожнее.
в if (@$_GET['action'] == 'test') криминала нет, но например если сделать
if (@$_GET[currentAction()] == 'test')
то ошибки внутри функции currentAction() тоже будут подавлены
 

Gas

может по одной?
а обработчик можно выкинуть
не понимаю зачем выкидывать, я в лог пишу ещё стек вызовов из debug_backtrace, а то файл и строка в стандартном логере - мало информативно.
 

Фанат

oncle terrible
Команда форума
Zextreo, чтобы видеть ошибки, показываемые пользователю, не нужно никакое шаманство с еррор хендлером. нужна единственная директива log_errors. и все.
 

fixxxer

К.О.
Партнер клуба
а, если нужен стек debug_backtarce-а в логах то да, тогда проверяй в обработчике

if (error_reporting() == 0) // @
{
return;
}
 

Zextreo

Новичок
ПОЛУЧИЛОСЬ!
Причем, сразу двумя способами! :)


1-й, очень простой:
PHP:
ini_set('log_errors', 'on');
ini_set('error_log', '/home/igry/error_log.txt');
2-й, с помощью "set_error_handler" с дополнительной проверкой "error_reporting()", если "0", значит ошибка экранирована симолом "@". А если не нулевое значение, значит, скорее всего, она бы отобразилась пользователю.

Всем большое спасибо, особенно пользователю "fixxxer"! :)

-~{}~ 12.11.08 23:49:

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

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