Edit report at http://bugs.php.net/bug.php?id=51463&edit=1
ID: 51463 User updated by: tyra3l at gmail dot com Reported by: tyra3l at gmail dot com Summary: ErrorException thrown from error_handler not catchable in exception handler Status: Re-Opened Type: Bug Package: Scripting Engine problem Operating System: Windows Xp Sp3, Debian Lenny PHP Version: 5.3.2 New Comment: Another weird thing that I observed: If I try to handle the fatal error from register shutdown function then the error_get_last() will return NULL if I throw the ErrorException from the error handler. If I don't try to convert exceptions from errors, then the error_get_last() will return the fatal error in the shutdown function. Or if I generate fatal error for example with new NonExistentClassName; then the error_handler doesn't get called (because this is a fatal error), but the shutdown function gets the fatal error with error_get_last() So it seems that there is some strange magic with this situation. Tyrael Previous Comments: ------------------------------------------------------------------------ [2010-04-02 13:41:02] tyra3l at gmail dot com But the exception handler should be called after the error handler and before accessing the empty property which gives the fatal error, isn't it? I mean at first the interpreter tries to access the variable named $foo, then generates a E_NOTICE which is trapped by the error handler, which trows an Exception which never catched at all. ------------------------------------------------------------------------ [2010-04-02 13:35:54] tyra3l at gmail dot com shit, my mistake, $foo will be empty, so $this->$foo will be generating a fatal error, but before that, generate a warning about $foo is empty. :/ ------------------------------------------------------------------------ [2010-04-02 13:33:40] tyra3l at gmail dot com On Lenny I was testing with the dotdeb.org 5.3.2 deb, on windows this is the TS VC9 build ------------------------------------------------------------------------ [2010-04-02 13:29:49] tyra3l at gmail dot com Description: ------------ It seems that there are some cases, when you can't catch Exceptions with exception_handler which was thrown from error_handler for some errors. For example if you do this: $class = new StdClass; echo $class->$foo; error_handler gets called, ErrorException was thrown, but the Exception wasn't catched with the exception_handler. if you try echo $foo; instead of echo $class->$foo; then the "same" error gets called with the error handler (by same error, I mean same parameters), but the Exception thrown in this case is successfuly catched by the exception handler. Test script: --------------- <?php error_reporting(E_ALL); ini_set('display_errors', 0); function debug($s){ echo "<pre>"; var_dump($s); echo "</pre>"; } set_error_handler( function ($errno, $errstr, $errfile, $errline ) { debug('error_handler'); debug(array( 'errno' => $errno, 'errstr' => $errstr, 'errfile' => $errfile, 'errline' => $errline, )); throw new ErrorException($errstr, 0, $errno, $errfile, $errline); } ); set_exception_handler( function(Exception $e){ debug('exception_handler'); debug($e); } ); $class = new StdClass; echo $class->$foo; echo 'done'; Expected result: ---------------- string(13) "error_handler" array(4) { ["errno"]=> int(8) ["errstr"]=> string(23) "Undefined variable: foo" ["errfile"]=> string(55) "C:\work\xampp_vc9\htdocs\default\bug\error_handling.php" ["errline"]=> int(46) } string(17) "exception_handler" object(ErrorException)#4 (8) { ["message":protected]=> string(23) "Undefined variable: foo" ... Actual result: -------------- string(13) "error_handler" array(4) { ["errno"]=> int(8) ["errstr"]=> string(23) "Undefined variable: foo" ["errfile"]=> string(55) "C:\work\xampp_vc9\htdocs\default\bug\error_handling.php" ["errline"]=> int(46) } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=51463&edit=1