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

  • Автор темы Автор темы Zextreo
  • Дата начала Дата начала

Zextreo

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

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

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

Но в обработчик у меня попадают все ошибки, как будто я их не экранирую, т.е. код ошибки всегда не нулевой.

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

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

-~{}~ 12.11.08 13:48:

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

-~{}~ 12.11.08 14:02:

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

Не надо оттуда ничего брать.
 
Та статья - это перевод того, что написано в 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.
Тригерами пользоваться я не собираюсь.

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

Сайт я буду еще долго разратывать и дорабатывать, и такую функцию, как лог ошибок, было бы очень полезно иметь.
 
Вот пример обработчика 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>
 
Zextreo, лог ошибок есть стандартный в php, если хочешь логировать какие-то события кроми ошибок, то пиши их в файлы руками.

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

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

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

-~{}~ 12.11.08 14:00:

fixxxer "сюрприз-сюрприз"
В настройках можно устранить проблемму?
На какую настройку обратить внимание?
 
на error_log , log_errors и display_errors. а обработчик можно выкинуть ;)

-~{}~ 12.11.08 15:07:

а собаку юзай осторожнее.
в if (@$_GET['action'] == 'test') криминала нет, но например если сделать
if (@$_GET[currentAction()] == 'test')
то ошибки внутри функции currentAction() тоже будут подавлены
 
а обработчик можно выкинуть
не понимаю зачем выкидывать, я в лог пишу ещё стек вызовов из debug_backtrace, а то файл и строка в стандартном логере - мало информативно.
 
Zextreo, чтобы видеть ошибки, показываемые пользователю, не нужно никакое шаманство с еррор хендлером. нужна единственная директива log_errors. и все.
 
а, если нужен стек debug_backtarce-а в логах то да, тогда проверяй в обработчике

if (error_reporting() == 0) // @
{
return;
}
 
ПОЛУЧИЛОСЬ!
Причем, сразу двумя способами! :)


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:

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

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