[Debug] fix handling deprecated warnings and stacked errors turned into exceptions

This commit is contained in:
Nicolas Grekas 2014-05-05 07:39:13 +00:00
parent 19db5f7c4b
commit 95f3276309
2 changed files with 30 additions and 25 deletions

View File

@ -154,12 +154,10 @@ class ErrorHandler
self::$loggers['deprecation']->warning($message, array('type' => self::TYPE_DEPRECATION, 'stack' => $stack));
}
return true;
}
return true;
}
if ($this->displayErrors && error_reporting() & $level && $this->level & $level) {
} elseif ($this->displayErrors && error_reporting() & $level && $this->level & $level) {
if (self::$stackedErrorLevels) {
self::$stackedErrors[] = func_get_args();
@ -264,22 +262,35 @@ class ErrorHandler
gc_collect_cycles();
$error = error_get_last();
while (self::$stackedErrorLevels) {
static::unstackErrors();
// get current exception handler
$exceptionHandler = set_exception_handler('var_dump');
restore_exception_handler();
try {
while (self::$stackedErrorLevels) {
static::unstackErrors();
}
} catch (\Exception $exception) {
if ($exceptionHandler) {
call_user_func($exceptionHandler, $exception);
return;
}
if ($this->displayErrors) {
ini_set('display_errors', 1);
}
throw $exception;
}
if (null === $error) {
return;
}
$type = $error['type'];
if (0 === $this->level || !in_array($type, array(E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE))) {
if (!$error || !$this->level || !in_array($error['type'], array(E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE))) {
return;
}
if (isset(self::$loggers['emergency'])) {
$fatal = array(
'type' => $type,
'type' => $error['type'],
'file' => $error['file'],
'line' => $error['line'],
);
@ -287,14 +298,8 @@ class ErrorHandler
self::$loggers['emergency']->emergency($error['message'], $fatal);
}
if ($this->displayErrors) {
// get current exception handler
$exceptionHandler = set_exception_handler('var_dump');
restore_exception_handler();
if ($exceptionHandler || self::$fatalHandler) {
$this->handleFatalError($exceptionHandler, $error);
}
if ($this->displayErrors && ($exceptionHandler || self::$fatalHandler)) {
$this->handleFatalError($exceptionHandler, $error);
}
}

View File

@ -134,12 +134,12 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
restore_error_handler();
$handler = ErrorHandler::register(E_USER_DEPRECATED);
$this->assertTrue($handler->handle(E_USER_DEPRECATED, 'foo', 'foo.php', 12, array()));
$this->assertFalse($handler->handle(E_USER_DEPRECATED, 'foo', 'foo.php', 12, array()));
restore_error_handler();
$handler = ErrorHandler::register(E_DEPRECATED);
$this->assertTrue($handler->handle(E_DEPRECATED, 'foo', 'foo.php', 12, array()));
$this->assertFalse($handler->handle(E_DEPRECATED, 'foo', 'foo.php', 12, array()));
restore_error_handler();
@ -162,7 +162,7 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
$handler = ErrorHandler::register(E_USER_DEPRECATED);
$handler->setLogger($logger);
$handler->handle(E_USER_DEPRECATED, 'foo', 'foo.php', 12, array());
$this->assertTrue($handler->handle(E_USER_DEPRECATED, 'foo', 'foo.php', 12, array()));
restore_error_handler();