Edit report at https://bugs.php.net/bug.php?id=61767&edit=1

 ID:                 61767
 Updated by:         larue...@php.net
 Reported by:        shiranai7 at hotmail dot com
 Summary:            Shutdown functions not called in certain error
                     situation
-Status:             Open
+Status:             Analyzed
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Win7
 PHP Version:        5.4.0
 Block user comment: N
 Private report:     N

 New Comment:

I attached a fix for this, maybe need dmitry to review it.


Previous Comments:
------------------------------------------------------------------------
[2012-04-20 06:01:10] larue...@php.net

The following patch has been added/updated:

Patch Name: bug61767.patch
Revision:   1334901670
URL:        
https://bugs.php.net/patch-display.php?bug=61767&patch=bug61767.patch&revision=1334901670

------------------------------------------------------------------------
[2012-04-20 05:52:05] larue...@php.net

a E_NOTICE "undefined variable" has been triggered before the FATAL_ERROR.  
hmm, 
the same thing as #60909

------------------------------------------------------------------------
[2012-04-19 22:56:56] ni...@php.net

This seems related: https://bugs.php.net/bug.php?id=60909

------------------------------------------------------------------------
[2012-04-19 09:07:06] shiranai7 at hotmail dot com

Allow me to re-specify the expected result:
----------

Error handler called
Fatal error: Uncaught exception 'ErrorException' with message 'Undefined 
variable: undefined' in C:\Dokumenty\localhost\base\test_case1.php:14 Stack 
trace: #0 _example_(14): {closure}(8, 'Undefined varia...', 
'C:\Dokumenty\lo...', 14, Array) #1 {main} thrown in 
C:\Dokumenty\localhost\base\test_case1.php on line 14
Shutting down Array ( [type] => 1 [message] => Uncaught exception 
'ErrorException' with message 'Undefined variable: undefined' in _example_:14 
Stack trace: ... [file] => _example_ [line] => 14 )

------
This is because the error_handler gets actually called for the E_NOTICE - so an 
exception should be thrown (and later uncaught in the example). But the 
exception gets *eaten* as I described.

------------------------------------------------------------------------
[2012-04-18 18:39:02] shiranai7 at hotmail dot com

Description:
------------
I am using register_shutdown_function() toghether with error_get_last() and 
set_error_handler() to "handle" fatal errors (to display message in debug 
screen etc, details do not matter).

Everything works perfectly except for one specific scenario - If there is an 
error caused by calling a method on UNDEFINED (really undefined, not null etc) 
variable, then the following happens (NOT OK, UNEXPECTED):

 1. registered error_handler is invoked for E_NOTICE (undefined variable) 
 2. the error_handler throws an ErrorException
 3. the exception gets *eaten* by something, it never makes it out of the 
error_handler
 4. PHP exits with FATAL error (Call to a member function foo() on a non-object)
 5. No shutdown functions get called

----

If the variable is not UNDEFINED but just not an object (e.g. null), everything 
happens as follows (ALL OK, EXPECTED):

 1. PHP exits with FATAL error (Call to a member function foo() on a non-object)
 2. Registered shutdown functions are called

----

If I return TRUE from the error_handler, following happens (OK, BUT NOT 
ACCEPTABLE):

 1. registered error_handler is invoked for E_NOTICE (undefined variable) 
 2. the error_handler returns TRUE
 3. PHP exits with FATAL error (Call to a member function foo() on a non-object)
 4. Registered shutdown functions are called

Test script:
---------------
set_error_handler(function($code, $msg, $file = null, $line = null) {
    echo "Error handler called\n";
    throw new \ErrorException($msg, $code, 0, $file, $line);
});

register_shutdown_function(function(){
    echo "Shutting down\n";
    print_r(error_get_last());
});

// $undefined = null; // defined variable does not cause problems
$undefined->foo();

Expected result:
----------------
Fatal error: Call to a member function foo() on a non-object in _example_ on 
line 14
Shutting down Array ( [type] => 1 [message] => Call to a member function foo() 
on a non-object [file] => _example_ [line] => 14 ) 

Actual result:
--------------
Error handler called
Fatal error: Call to a member function foo() on a non-object in _example_ on 
line 13



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=61767&edit=1

Reply via email to