За последние 24 часа нас посетили 20650 программистов и 1009 роботов. Сейчас ищут 363 программиста ...

Работа с ошибками...

Тема в разделе "Прочие вопросы по PHP", создана пользователем Vladson, 30 ноя 2008.

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Вот подумалось на досуге...

    Всюду опытные люди твердят "ошибки скриптов пишутся в логи, а пользователю на них плевать" (подробности в http://phpfaq.ru/debug3)

    Так нафига спрашивается вообще какие либо обработчики ошибок, или даже проверки типа isset($_GET['ТРА-ЛЯ-ЛЯ']) и тому подобное ?

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

    А надо ли оно всё ?
    Не проще ли тупо взять и без всяких проверок попробовать собственно сделать дело (пример сильно упрощённый)
    PHP:
    1. <?php
    2. // тупо сразу пробуем закачать
    3. if (move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name'])) {
    4.     // если закачался хорошо
    5.     header('Location: ok.html');
    6. } else {
    7.     // не закачался тоже пофигу
    8.     // сверяемся с $_FILES['userfile']['error']
    9.     // пишем юзеру что у него файл большой
    10.     // или если ошибки юзера там нет то пишем
    11.     // что админ лох напился и сайт сдох
    12. }
    13. ?>
    В "штатных" режимах ошибок не будет, о внештатных мы узнаем в логах.

    Так ли всё просто ?
     
  2. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    :lol:

    иногда не проверяю на существование переменных, а сразу сравниваю их значения... хз, главное, чтоб не было фатальных ошибок.. т.е. в мозгу надо проиграть все варианты возможных ситуаций, и знать, что ничого страшного не будет :)
     
  3. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Vladson, я сейчас кстати тоже серьезно подумываю над вопросом наваять классик для обработки ошибок. По уровням там, все как полагается. Все равно полезно знать, что там за проблемы бывают у юзверей.
    А про ошибки я так приблизительно и делаю. Типа "бла-бла-бла, произошла ошибка сценария, но администатор портала уже получил сообщение и в ближайшее время она будет исправлена. Приносим свои извинения и просим вас перейти на главную страницу и продолжить ознакомление с нашими услугами". Хотя на самом деле я пока ничего не получаю :)
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    наверное у меня у одно десятки вложенных if .. else
    зато сразу понятно где ошибка и что делать....
     
  5. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Mr.M.I.T., а если ошибка произошла у пользователя, а ты считал, что такая ситуация невозможна в принципе :)
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ShamahN
    а что за ошибка может произойти у пользователя и чтоб эту ошибку не выводил браузер?
     
  7. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Mr.M.I.T.
    правильнее, когда сайт уже посещается, блокировать отображение любых ошибок. Ты должен обработать ситуацию с ошибкой и вывести что-нить человеческое. Для чего посетителю знать что у тебя косяки с сайтом?
    А уже как руки доберутся открываешь лог и все узнаешь.
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ээ, так я это и имел ввиду под
    значит десятки возможных ошибок
     
  9. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Mr.M.I.T., ну, допустим, ты отловил ошибку, а как ты о ней узнаешь?
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    мы видно о разных ошибках говрим =))
    короче походу тема об ошибках пхп, я почему-то подумал что о пользовательских ошибках...[/quote]
     
  11. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    В общем, представляю на обсуждение. Замечания приветствуются
    PHP:
    1. <?php
    2. class error
    3. {
    4.     private $log_file    = "logs/log.txt";
    5.     private $user_ip     = '';
    6.     private $date_time   = '';
    7.     private $errors      = array();
    8.     private $errors_num  = 0;
    9.     private $handle;
    10.    
    11.     function __construct()
    12.     {
    13.         $this->user_ip   = $_SERVER['REMOTE_ADDR'];
    14.         $this->date_time = date("Y.m.d H:i:s");
    15.         $this->init();
    16.     }
    17.    
    18.     private function init()
    19.     {
    20.         if (is_writable($this->log_file))
    21.         {
    22.             if ($this->handle = fopen($this->log_file, 'a'))
    23.             {
    24.                 $somecontent = "   ". $this->date_time.", IP-адрес пользователя: ".$this->user_ip."\n";
    25.                 if (fwrite($this->handle, $somecontent) === FALSE)
    26.                 {//Что-то сделать
    27.                 }
    28.             }
    29.             else
    30.             {//что-то сделать
    31.             }
    32.         }
    33.         else
    34.         {//что-то сделать
    35.         }
    36.     }
    37.    
    38.     public function add($error_message, $error_level)
    39.     {
    40.         if (gettype($this->handle) != "resource") return;               //Файл не был открыт
    41.         $this->errors[$this->errors_num]['error_message'] = $error_message;
    42.         $this->errors[$this->errors_num]['error_level'] = $error_level;
    43.         $this->errors_num++;
    44.         $somecontent = $error_level."   ".$error_message."\n";
    45.         if (fwrite($this->handle, $somecontent) === FALSE)
    46.         {//Что-то сделать
    47.         }
    48.     }
    49.     function __destruct()
    50.     {
    51.         if (gettype($this->handle) != "resource") return;               //Файл не был открыт
    52.         fwrite($this->handle, "\n");
    53.         fclose($this->handle);
    54.     }
    55. }
    56. ?>
    ЗЫ: Хотел все одним разом сделать, но почему-то в деструкторе нельзя открыть файл
     
  12. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  13. ShamahN

    ShamahN Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Sergey89, ааххх спасибо :) классное колесо я изобрел :)
     
  14. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
  15. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Ti
    Не тупи, вопрос не в том как реализовать заливку файла или как избежать ошибок, а о конкретно голом процедурном подходе в целом (без АОП/ООП/ИТД/иПЗДЦ) и о том как игнорировать (не обрабатывать) "ошибки" (не фатальные, и безопасные)
     
  16. kostyl

    kostyl Guest

    Vladson
    тут прослеживается явная обратная пропорциональность:
    чем больше ты ленишься, тем меньше успех вцелом.
    Конечно же есть моменты, когда "тотальную" обработку ситуаций нужно опускать. Но всё это нужно делать исходя из того, что ты желаешь получить в итоге. Можно при любой ошибке писать ее в лог и редирект на индэкс. Но это точно не самый лучший вариант. Полный контроль над твоим приложением и разумная функциональность обработки ошибок всегда будут привальирующими (черт, сложное слово). Короче надо еще подумать........
     
  17. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    А где в приведённом случае нет контроля?

    Все ошибки юзера и его браузера можно увидеть в $_FILES['userfile']['error'] и спокойно показать их юзеру, это не проблема

    Так в чём и вопрос, а почему я должен обрабатывать ошибки если сам РНР справляется с этим даже лучше меня ?
     
  18. kostyl

    kostyl Guest

    Да, в приведенном примере php все делает сам - тут можно и не заморачиваться, а в случаях где php это показывает лучше скрывать от пользователя. Короче, если ошибка может менять тот алгоритм работы скрипта, который тебе нужен, то ее надо обрабатывать должным образом, чтобы функциональность приложения не нарушалась и ты, в случае ее возникновения, смог бы определить недостаток из логов. Если же нет, как в случае с файлом, то и ну ее нафих.