имеется некий код: Код (Text): $fff=unknown_function(2/3); где unknown_function - ессно, функция, нигде не объявленная. При трассировке кода PHP вылетает ровно на этом месте. При этом обработчик ошибок, опредленный через Код (Text): $old_error_handler = set_error_handler("myErrorHandler",E_ALL); вообще никак не отрабатывает (при штатных ошибках его работоспособность проверена). Аналогичная ситуация происходит при вызове Код (Text): some_module::unknown_function_2('params') Вопрос - можно ли както-то настроить Пых т.о., чтобы ошибки эти адекватно проходили обработчик, а не приводили к крашу? Есть ли вообще какие-либо уловки на этот случай?
можно как раз через обработчик ошибок - внутри него просто внимательнее смотрите на характер ошибки и делайте вывод - выбрасывать ее в поток, фатально завершаться или прожевать и бежать дальше.
обработчик объявляется и устанавливается в самом начале. пых штука умная, он не будет в отличии от компилируемых языков лезть во все дебри в поисках правильности скрипта. он встретиться с отсутствием функции только на этапе исполнения байт-кода. и тогда он что сделает? правильно - породит вызов ошибки. куда это попадет? правильно - в обработчик который мы объявили ранее. что он будет ждать? правильно - нашего решения. скажем умереть - умрет. скажем бежать дальше - побежит дальше. удивится конечно, но дальше побежит.
вы меня пытаетесь убедить в том, что у меня галлюцинации? я трассирую код пошагово и имею возможность наблюдать, где вход в процедуру обработчика ошибок производится, а где - нет
можно проверить, существует ли функция ДО того, как её дергать. А отловить можно, да. Даже с фаталом. Это надо на хабре смотреть.
можно, но нужно вот так вот. Ибо CMS === over 9000 функций и классов. а пруфов не будет? пока что нагуглил на Хабре только феерический пост расстановки точек над Пыхом
http://stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error в любом случае тебе придётся застрелить выполнение скрипта, ибо не ясно, что делать с кодом который вызывает функу и дальше. Добавлено спустя 3 минуты 10 секунд: http://habrahabr.ru/search/?q=php+fatal третья ссылка чувак http://habrahabr.ru/post/73589/
сделал по этому: итого Код (Text): function fatal_error_handler($buffer) { //логгирование $m_logfile="E:/temp/msverrlog.log"; $msvf=fopen($m_logfile, "a+"); fwrite($msvf,"FATAL ERROR\n"); fwrite($msvf,date("H:i:s d.m.Y")."\n"); fwrite($msvf,print_r($buffer,true)."\n\r"); fclose ($msvf); return $buffer; } ob_start("fatal_error_handler"); $fff=gopa(2/3); не записывает в лог абсолютно ничего! т.е. $buffer оказвыается пустой, хотя ошибка должна быть по идее не-определенной функции
не должно быть. вы просто не поняли какой кусок кода скопировали. я тут за вас погуглил - такую (ундефинед функтион) ошибку, т.е. фатальную, невозможно отловить через эррор_хэндлер. зато можно через регистер_шутдаун_фанкшн.
ну или Exception. Что-то кажись не получится у вас через register_shutdown_function exit все равно задействуется... и скрипт дальше не отработает... Код (PHP): error_reporting(0); register_shutdown_function('fatal_handler'); function fatal_handler() { echo'fatal_error'; } $a=funt(); echo 1; // Не отработает...
да мне бы просто получить визуальное подтверждение предположений в виде сообщения, а дальше пока хоть трава не расти =)
А зачем так писать, того, что не существует?)) Смысл? На это есть проверки function_exists, method_exists. И им подобные, функции для проверки на существование...