Edit report at https://bugs.php.net/bug.php?id=61767&edit=1
ID: 61767
User updated by: shiranai7 at hotmail dot com
Reported by: shiranai7 at hotmail dot com
Summary: Shutdown functions not called in certain error
situation
Status: Open
Type: Bug
Package: Scripting Engine problem
Operating System: Win7
PHP Version: 5.4.0
Block user comment: N
Private report: N
New Comment:
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.
Previous Comments:
------------------------------------------------------------------------
[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