[Debug][ErrorHandler] Preserve our error handler when a logger set another one
This commit is contained in:
parent
ccf6223c7a
commit
b979fff6b8
@ -523,6 +523,10 @@ class ErrorHandler
|
||||
$this->loggers[$type][0]->log($level, $logMessage, $errorAsException ? ['exception' => $errorAsException] : []);
|
||||
} finally {
|
||||
$this->isRecursive = false;
|
||||
|
||||
if (!\defined('HHVM_VERSION')) {
|
||||
set_error_handler([$this, __FUNCTION__]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12,10 +12,13 @@
|
||||
namespace Symfony\Component\Debug\Tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Psr\Log\LogLevel;
|
||||
use Psr\Log\NullLogger;
|
||||
use Symfony\Component\Debug\BufferingLogger;
|
||||
use Symfony\Component\Debug\ErrorHandler;
|
||||
use Symfony\Component\Debug\Exception\SilencedErrorContext;
|
||||
use Symfony\Component\Debug\Tests\Fixtures\LoggerThatSetAnErrorHandler;
|
||||
|
||||
/**
|
||||
* ErrorHandlerTest.
|
||||
@ -321,6 +324,8 @@ class ErrorHandlerTest extends TestCase
|
||||
$handler = new ErrorHandler();
|
||||
$handler->setDefaultLogger($logger);
|
||||
@$handler->handleError(E_USER_DEPRECATED, 'Foo deprecation', __FILE__, __LINE__, []);
|
||||
|
||||
restore_error_handler();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -583,4 +588,43 @@ class ErrorHandlerTest extends TestCase
|
||||
|
||||
$handler->handleException(new \Exception());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider errorHandlerIsNotLostWhenLoggingProvider
|
||||
*/
|
||||
public function testErrorHandlerIsNotLostWhenLogging($customErrorHandlerHasBeenPreviouslyDefined, LoggerInterface $logger)
|
||||
{
|
||||
try {
|
||||
if ($customErrorHandlerHasBeenPreviouslyDefined) {
|
||||
set_error_handler('count');
|
||||
}
|
||||
|
||||
$handler = ErrorHandler::register();
|
||||
$handler->setDefaultLogger($logger);
|
||||
|
||||
@trigger_error('foo', E_USER_DEPRECATED);
|
||||
@trigger_error('bar', E_USER_DEPRECATED);
|
||||
|
||||
$this->assertSame([$handler, 'handleError'], set_error_handler('var_dump'));
|
||||
|
||||
restore_error_handler();
|
||||
|
||||
if ($customErrorHandlerHasBeenPreviouslyDefined) {
|
||||
restore_error_handler();
|
||||
}
|
||||
} finally {
|
||||
restore_error_handler();
|
||||
restore_exception_handler();
|
||||
}
|
||||
}
|
||||
|
||||
public function errorHandlerIsNotLostWhenLoggingProvider()
|
||||
{
|
||||
return [
|
||||
[false, new NullLogger()],
|
||||
[true, new NullLogger()],
|
||||
[false, new LoggerThatSetAnErrorHandler()],
|
||||
[true, new LoggerThatSetAnErrorHandler()],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Debug\Tests\Fixtures;
|
||||
|
||||
use Psr\Log\AbstractLogger;
|
||||
|
||||
class LoggerThatSetAnErrorHandler extends AbstractLogger
|
||||
{
|
||||
public function log($level, $message, array $context = [])
|
||||
{
|
||||
set_error_handler('is_string');
|
||||
restore_error_handler();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user