Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Об ошибках, для начинающих 
:(
    Опции темы
Feldmarschall
Дата 17.4.2008, 09:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Отвечая на вопросы в форуме, я заметил одну вещь.
Новички часто не понимают значения сообщения об ошибке. Просто не обращают внимания на его текст.
Подход у многих такой: "Есть код, он выдает ошибку. Что в коде исправить?". При этом даже не пишут - какая именно ошибка!
Текст ошибки просто игнорируется. Не делается даже попытки им как-то воспользоваться. Или, если сообщения на экране нет - то найти его и прочитать.
То есть, это принципиальный момент: сообщение об ошибке не рассматривается, как помощь при её исправлении. Вообще.
При том, что это самый главный инструмент исправления ошибки 
Именно эту мысль я и хочу донести до читателей: важно сообщение об ошибке читать, и пытаться понять, что в нем написано.
Пытаться исправить код не читая сообщение об ошибке - это каменный век! Это бессмысленная трата времени.
Именно поэтому опытный программист не будет пытаться угадывать - почему не работает его код, а сначала постарается увидеть сообщение об ошибке. 
Именно поэтому опытный программист не будет пытаться угадывать, какая именно проблема в коде, который запостили на форум - он попросит привести текст сообщения об ошибке.
Ведь в нем, в этом сообщении, все написано!

Разберем типичное сообщение об ошибке:
Цитата

Notice:  Undefined variable: var in D:\SERVER\test.php on line 3

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

Undefined variable: var 

Да, надо знать английский язык. Без этого - никуда.
Но если знать, то все сразу станет ясно: переменная, к которой мы пытаемся обратиться, не существует. И дается её имя - $var
Осталось разобраться,  почему переменной нету, и исправить код так, чтобы она появилась и имела нужное значение.
Точно так же работаем со всеми другими ошибками - читаем текст и смотрим строку, в которой ошибка.

Кроме PHP об ошибках нам могут сообщать другие элементы системы - SQL Сервер, веб-сервер. Надо знать, как получить ошибки от них.

Поэтому несколько конкретных рекомендаций:
  • В сообщении об ошибке чаще всего написано - в чем проблема. Надо просто прочитать и исправить. 
  • Если непонятно, что в нем написано, то надо обязательно писать его на форуме, вместе со своим вопросом.  
  • При этом надо не переписывать от себя, а копировать, причем копировать целиком: "ненужные", на непосвященный взгляд, детали могут оказаться очень важными.
  • Если веб-сервер выдает ошибку 500 или пустую страницу, то текст сообщения об ошибке надо смотреть в логе ошибок веб-сервера. В windows, при дефолтной установке, он находится файле C:\Program Files\Apache Software Foundation\Apache2.2\logs\error.log. На хостинге расположение у лога ошибок может быть разное, но найти обычно нетрудно. Называется error_log или error.log
  • Если происходят проблемы с mysql, то надо вызывать функцию mysql_error() которая напишет, какие проблемы были в запросе.
  • Чтобы увидеть ошибки на экране, надо или php.ini выставить директиву display_errors = on, или создать файл .htaccess и поместить в него строчку php_flag display_errors 1
    Но на рабочем сервере так делать нельзя - ошибки не должны показываться пользователям. На рабочем сервере ошибки надо смотреть в логе. 
  • Самой первой строчкой скрипта написать error_reporting(E_ALL);
  • Если встретился случай, не описанный в этом списке, то все равно - пытаться найти и прочесть сообщение об ошибке.
P.S. Я в курсе, что из тех, кому он предназначается, этот текст не прочтет никто. Но наболело =)

Это сообщение отредактировал(а) Feldmarschall - 24.7.2008, 23:32
PM   Вверх
skyboy
Дата 13.7.2008, 12:45 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



В "стандартном" сообщении об ошибке обычно сообщается только место(строка и имя файла), в котором происходит сбой.
Если ошибка не критическая(до E_WARNING) включительно, то можно установить собственный обработчик ошибок через set_error_handler, в котором при помощи debug_backtrace сделать вывод всего стека вызовов: кто, когда  и откуда первоначально сделал вызов, который, в конце концов, привел к ошибке.

PM MAIL   Вверх
MuToGeN
Дата 20.7.2008, 10:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 7
Всего: 32



1. Еще лучше не забывать о том, что для вас как для разработчика это просто сообщение об ошибке, но для кого-то другого оно может сказать "вот в этом скрипте есть такая-то уязвимость". Это особенно актуально для тех, у кого программирование на PHP не просто увлечение, а профессия. Т.е. вывод ошибок в браузер полезен только на этапе разработки, а когда проект запускается в "боевом" режиме, то это стоит отключать (я обычно использую перехват того, что можно перехватить, через set_error_handler() и set_exception_handler() с последующей отправкой на мой e-mail, и логирование всего, что перехватить нельзя - директивы конфига log_errors и log_file_name, error_log() итп). 
2. 
Цитата(Feldmarschall @  17.4.2008,  09:48 Найти цитируемый пост)
E_ALL

Точнее, E_ALL | E_STRICT. Во-первых это поможет понять, в чем именно стоит усовершенствовать свои знания (да, даже матерым профи порой приходится читать мануалы по концепциям ООП), во-вторых - как недавно было упомянуто на форуме, в PHP6 бит E_STRICT будет включен в E_ALL.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1090 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.