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

Reply via email to