track_errors и fatal error

Макс

Старожил PHPClub
track_errors и fatal error

Если кратко, то после fatal error в $php_errormsg не сохранятется текст сообщения.

Пример :
PHP:
ini_set('track_errors', 'On');
function shutdown () {
    global $php_errormsg;
    echo "ERROR : ".$php_errormsg."\n";
}
register_shutdown_function('shutdown');
set_error_handler('shutdown');
$a = '';
$a->aaa();
Выводит :
Код:
Fatal error: Call to a member function aaa() on a non-object in C:\usr\php_5_1_cvs\a.php on line 12
ERROR :
То есть в shutdown() мы попадаем но $php_errormsg пустая. На bugs.php.net ответили что это не баг.

Доку читал, но по track_errors и php_errormsg всего пару предложений написано.

Что я не понял или что не прочитал ? Почему сообщение об ошибке не сохраняется в php_errormsg ?
 

Макс

Старожил PHPClub
у них для небагов стандартный текст :
Код:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php
 

asm

Пофигист
читаем
Note:
The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and E_STRICT.
 

tony2001

TeaM PHPClub
Макс
проблема в том, что после FATAL/CORE etc. ошибок engine может находиться в нестабильном состоянии.
вообще-то, и shutdown functions не должны вызываться при этом (ибо fatal == "всё пропало")..
с другой стороны, это решить просто - передвинуть заполнение php_errormsg чуть выше в main/main.c, php_error_cb().
 

Макс

Старожил PHPClub
asm
Ну я все-таки не error_handler (set_error_handler) делаю, так что не совсем очевидно, что это имеет отношение.

tony2001
проблема в том, что после FATAL/CORE etc. ошибок engine может находиться в нестабильном состоянии.
а E_PARSE в их число входит ? Меня как раз смутило, что можно получить сообщение от PARSE-error (если include-ить скрипт с синтаксической ошибкой) :
PHP:
<?
ini_set('track_errors', 'On');
function shutdown () {
    global $php_errormsg;
    echo "ERROR : ".$php_errormsg."\n";
}
register_shutdown_function('shutdown');
set_error_handler('shutdown');
include('failed.php'); // <?echo 'aa' echo 'b';? >
?>
выдаст :
Код:
Parse error: parse error, unexpected T_ECHO, expecting ',' or ';' in C:\usr\php_5_1_cvs\failed.php on line 1
ERROR : parse error, unexpected T_ECHO, expecting ',' or ';'
с другой стороны, это решить просто - передвинуть заполнение php_errormsg чуть выше в main/main.c, php_error_cb().
Понял, спасибо.
 

tony2001

TeaM PHPClub
E_PARSE - по идее, нет.
нас интересует состояние экзекутора, а не компилятора, а при E_PARSE он еще не начал работу.
 

tony2001

TeaM PHPClub
Известно что - взяли бы gdb и выяснили всё бы сами за 10 минут =)
 

AnToXa

prodigy-одаренный ребенок
дык может быть сделаем патчик и в mainline php, а?
ничего не ломает вроде.
 

anight

Новичок
> ничего не ломает вроде.

Хотелось бы оценки уровня эксперта. Но потестить на кошках можно, я согласен.
 

AnToXa

prodigy-одаренный ребенок
Хотелось бы оценки уровня эксперта. Но потестить на кошках можно, я согласен.
ну я не эксперт, конечно, но ты код посмотри, чего там.

а кошки - это кто такие, чур не я? :D
 

anight

Новичок
с другой стороны, даже если будет падать - все равно запрос не обработан - fatal error occured.
 

phprus

Moderator
Команда форума
anight
Эксперт говорит:
после FATAL/CORE etc. ошибок engine может находиться в нестабильном состоянии.
По этому впринципе такой патч вполне может чтото ломать, но это лиш мое предположение сделанное на основе поста tony2001
 
Сверху