Edit report at https://bugs.php.net/bug.php?id=60188&edit=1
ID: 60188
Comment by: hinikato at gmail dot com
Reported by: hinikato at gmail dot com
Summary: Exception handler and shutdown hanlder were not
called after throwing exception
Status: Bogus
Type: Bug
Package: Scripting Engine problem
Operating System: Windows 7 x64
PHP Version: 5.3.8
Block user comment: N
Private report: N
New Comment:
Why PHP will not call at least shutdown function in such situtations? Because
the engine is in the an unreliable state... What is unreliable state? Is it bug
that PHP developers unable to fix due some limitations?
Previous Comments:
------------------------------------------------------------------------
[2011-11-02 13:29:57] hinikato at gmail dot com
According this quote the bug should not occur if specified error types
will not be raised in the file where set_error_handler() is called.
Let's try to move the respective code fragment to the other file:
-- set_error_handler.php --
<?php
$foo = new \Foo\MyErrorHandler();
set_error_handler(array($foo, 'errorHandler'));
set_exception_handler(array($foo, 'exceptionHandler'));
register_shutdown_function(array($foo, 'fatalErrorHandler'));
?>
-- end of set_error_handler.php --
then let's modify slightly the our example:
-- bug --
namespace Foo;
class MyErrorHandler {
function errorHandler() {
echo __METHOD__ . "\n";
throw new \Exception('test');
}
function exceptionHandler() {
echo __METHOD__ . "\n"; // should be called!
}
function fatalErrorHandler() {
echo __METHOD__ . "\n"; // should be called!
}
}
require_once __DIR__ . '/set_error_handler.php';
require_once __DIR__ . '/not_existing_file.php'; // file should not
exist
die();
-- end of bug --
If you will try to run this example you will get the same invalid
behavior.
------------------------------------------------------------------------
[2011-11-02 12:12:52] [email protected]
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
If a fatal error (E_ERROR) is created the engine might be in an unreliable
state, we therefore can't all error handlers. Quoting the docs:
"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 most of E_STRICT raised in the file where
set_error_handler() is called. "
http://php.net/set_error_handler
------------------------------------------------------------------------
[2011-11-01 12:10:43] hinikato at gmail dot com
Description:
------------
The neither exception handler nor fatal error handler have not been called if
error handler throws exception in case of including not existent file using
require_once.
My PHP version is: PHP Version 5.3.8-ZS5.5.0
Test script:
---------------
<?php
namespace Foo;
class MyErrorHandler {
function __construct() {
set_error_handler(array($this, 'errorHandler'));
set_exception_handler(array($this, 'exceptionHandler'));
register_shutdown_function(array($this, 'fatalErrorHandler'));
}
function errorHandler() {
echo __METHOD__ . "\n";
throw new \Exception('test');
}
function exceptionHandler() {
echo __METHOD__ . "\n"; // should be called!
}
function fatalErrorHandler() {
echo __METHOD__ . "\n"; // should be called!
}
}
echo '<pre>';
$foo = new MyErrorHandler();
require_once __DIR__ . '/not_existing_file.php'; // file should not exist
die();
Expected result:
----------------
Foo\MyErrorHandler::errorHandler
Foo\MyErrorHandler::exceptionHandler
Foo\MyErrorHandler::fatalErrorHandler
Fatal error: main() [function.require]: Failed opening required
'X:\home\localhost\www/not_existing_file.php'
(include_path='D:\system\home\projects\myak\www\includes') in
X:\home\localhost\www\test.php on line 28
Actual result:
--------------
Foo\MyErrorHandler::errorHandler
Fatal error: main() [function.require]: Failed opening required
'X:\home\localhost\www/not_existing_file.php'
(include_path='D:\system\home\projects\myak\www\includes') in
X:\home\localhost\www\test.php on line 28
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=60188&edit=1