За последние 24 часа нас посетили 17390 программистов и 1721 робот. Сейчас ищут 937 программистов ...

отловить ошибку не-определенной функции?

Тема в разделе "Прочие вопросы по PHP", создана пользователем MinasFilm, 15 мар 2013.

  1. MinasFilm

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

    С нами с:
    4 мар 2013
    Сообщения:
    47
    Симпатии:
    0
    имеется некий код:
    Код (Text):
    1. $fff=unknown_function(2/3);
    где unknown_function - ессно, функция, нигде не объявленная.
    При трассировке кода PHP вылетает ровно на этом месте.
    При этом обработчик ошибок, опредленный через
    Код (Text):
    1. $old_error_handler = set_error_handler("myErrorHandler",E_ALL);  
    вообще никак не отрабатывает (при штатных ошибках его работоспособность проверена).

    Аналогичная ситуация происходит при вызове
    Код (Text):
    1. some_module::unknown_function_2('params')
    Вопрос - можно ли както-то настроить Пых т.о., чтобы ошибки эти адекватно проходили обработчик, а не приводили к крашу?
    Есть ли вообще какие-либо уловки на этот случай?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    можно как раз через обработчик ошибок - внутри него просто внимательнее смотрите на характер ошибки и делайте вывод - выбрасывать ее в поток, фатально завершаться или прожевать и бежать дальше.
     
  3. MinasFilm

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

    С нами с:
    4 мар 2013
    Сообщения:
    47
    Симпатии:
    0
    до обработчика ошибок дело не доходит же - PHP просто вылетает на строке с неизвестной функции
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    обработчик объявляется и устанавливается в самом начале. пых штука умная, он не будет в отличии от компилируемых языков лезть во все дебри в поисках правильности скрипта. он встретиться с отсутствием функции только на этапе исполнения байт-кода. и тогда он что сделает? правильно - породит вызов ошибки. куда это попадет? правильно - в обработчик который мы объявили ранее. что он будет ждать? правильно - нашего решения. скажем умереть - умрет. скажем бежать дальше - побежит дальше. удивится конечно, но дальше побежит.
     
  5. MinasFilm

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

    С нами с:
    4 мар 2013
    Сообщения:
    47
    Симпатии:
    0
    вы меня пытаетесь убедить в том, что у меня галлюцинации? :)
    я трассирую код пошагово и имею возможность наблюдать, где вход в процедуру обработчика ошибок производится, а где - нет
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    можно проверить, существует ли функция ДО того, как её дергать. А отловить можно, да. Даже с фаталом. Это надо на хабре смотреть.
     
  7. MinasFilm

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

    С нами с:
    4 мар 2013
    Сообщения:
    47
    Симпатии:
    0
    можно, но нужно вот так вот. Ибо CMS === over 9000 функций и классов.
    а пруфов не будет? пока что нагуглил на Хабре только феерический пост расстановки точек над Пыхом
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  9. MinasFilm

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

    С нами с:
    4 мар 2013
    Сообщения:
    47
    Симпатии:
    0
    сделал по этому:
    итого
    Код (Text):
    1. function fatal_error_handler($buffer) {
    2.       //логгирование
    3.     $m_logfile="E:/temp/msverrlog.log";
    4.     $msvf=fopen($m_logfile, "a+");
    5.     fwrite($msvf,"FATAL ERROR\n");
    6.     fwrite($msvf,date("H:i:s d.m.Y")."\n");
    7.     fwrite($msvf,print_r($buffer,true)."\n\r");
    8.     fclose ($msvf);
    9.   return $buffer;
    10. }
    11. ob_start("fatal_error_handler");
    12. $fff=gopa(2/3);
    не записывает в лог абсолютно ничего!
    т.е. $buffer оказвыается пустой, хотя ошибка должна быть по идее не-определенной функции
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    не должно быть. вы просто не поняли какой кусок кода скопировали.
    я тут за вас погуглил - такую (ундефинед функтион) ошибку, т.е. фатальную, невозможно отловить через эррор_хэндлер. зато можно через регистер_шутдаун_фанкшн.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    там по ссылке по регистер_шатдаун и делается вроде.
     
  12. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    ну или Exception.
    Что-то кажись не получится у вас через
    register_shutdown_function
    exit все равно задействуется... и скрипт дальше не отработает...
    Код (PHP):
    1. register_shutdown_function('fatal_handler');
    2. function fatal_handler() {
    3.     echo'fatal_error';
    4. }
    5. $a=funt();
    6. echo 1; // Не отработает...  
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а если удастся отловить, то всё равно что делать дальше? =)
     
  14. MinasFilm

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

    С нами с:
    4 мар 2013
    Сообщения:
    47
    Симпатии:
    0
    да мне бы просто получить визуальное подтверждение предположений в виде сообщения, а дальше пока хоть трава не расти =)
     
  15. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А зачем так писать, того, что не существует?)) Смысл?
    На это есть проверки function_exists, method_exists.
    И им подобные, функции для проверки на существование...
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    для этого смотрят в лог ошибок, брат