Welcome to php club

PHP FAQ from PHPclub.ru: DebugScripts ...

Начало | Каталог | Изменения | НовыеКомментарии | Вам запрещён доступПользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

Отладка скриптов

Как сделать собственный обработчик ошибок?


@ – атавизм.


Для отладки PHP, версий ниже 5, действительно лучше использовать error_reporting и перехватывать стандартный обработчик ошибок PHP.


Пример – кусок из моей библиотеки:


<?
if (DEBUG_MODE)
{
    
//All messages printed into browser window
    // error_reporting(E_ALL & ~E_NOTICE);
    
error_reporting(E_ALL);
}
else
{
    
error_reporting(0);
    include_once
'classes/bavlog.php';
    
set_error_handler(bavErrorHandler);
    
    
/*!
    override PHP's main error handler function
    this should NOT be called directly
    */
    
function nmErrorHandler($errno, $errmsg, $errfile, $errline, $vars)
    {
        ...
        ...
some analizer of error
    
}
}


А собственный вывод сообщений об ошибках и отладочной информации сделать не echo(), print(), а через trigger_error().


Подробности об использовании собственного обработчика есть в документации.


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

Как подавить сообщения при ошибках?


Указание @ перед функцией блокирует вывод сообщения об ошибке.


Если track_errors включен, то последнее сообщение об ошибке сохраняется в глобальной переменной $php_errormsg

Ошибки синтаксиса


Ошибки данного типа говорят о том, что автор скрипта, вероятнее всего, где-то опечатался. В общем виде выглядят примерно так:


Parse error: parse error описание ошибки in локальный путь к скрипту с ошибкой on line номер строки с ошибкой


Возможен и сокращённый вариант:


Parse error: parse error in локальный путь к скрипту с ошибкой on line номер строки с ошибкой


Основные проблемы при устранении таких ошибок сводятся к двум:


Найти строку, на которую указывает интерпретатор (для пользователей Блокнота, или любого редактора, который при автопереносе заменяет настоящий номер строки).


Найти строку, в которой РЕАЛЬНО произошла ошибка. Обычно это либо заявленная в сообщении строка, либо одна из строк, лежащих выше.


Например, следующий код:

<?
echo "Привет !"
// В РНР, оказывается, есть комментарии !
// Ну нифига себе !
echo "Пока !";
?>


выдаст ошибку: Parse error: parse error, expecting `', or `'; in локальный путь on line 6, хотя реально ошибка допущена в первой же строчке ! (пропущена ; )


Ещё хуже дело обстоит с пропуском фигурных скобок. Дело в том, что с точки зрения PHP запись for ($i==0; $i<10; $i++)

<?
echo "I=";
КОД
echo $i;
}
?>


содержит ошибку в 5 строке, а именно – лишнюю закрывающую скобку. Для интерпретатора код звучит примерно так:


Десять раз печатаем echo «I=";


Выполняем КОД 


Печатаем echo $i;


А это ещё что за } ?!


А ведь КОД может иметь не один десяток строк...


И совсем отдельная песня – кавычки. Во-первых, кавычку можно пропустить:


<?
echo "Переменные:;
echo $a;
echo $b;
// Ну нифига себе !
// А код может быть длинный !
echo $c;
echo $d;
echo "
Пока !";
?>


Скрипт вызовет ошибку только в восьмой строке, хотя пропустили кавычку вы в первой.


Во-вторых, кавычки можно перепутать, поскольку их в РНР два вида: " и ' :


<? echo "Переменные:';
echo $a;
echo $b;
// Ну нифига себе !
// А код может быть длинный !
echo $c;
echo $d;
echo "
Пока !";
?>


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


Ну и, наконец, можно напечатать что-то вроде:


<?
echo "<table border="0" width="780" align="center">";
?>


и головная боль вам обеспечена.


А вот правильные варианты:


<?
echo '<table border="0" width="780" align="center">';
echo
"<table border=\"0\" width=\"780\" align=\"center\">";
?>


Вот, вроде, и всё. Напоследок несколько советов:


Используйте редакторы с подсветкой – незакрытые кавычки они вам продемонстрируют.


Все циклы, операторы выбора и т.п. оформляйте «лесенкой», это позволит быстро найти пропущенную скобку.


Будьте бдительны :)



 
Много комментариев (2). [Показать комментарии/форму]