Skip to content

Commit 6621e8e

Browse files
fancywebcuchac
andcommitted
[Debug][ErrorHandler] Preserve next error handler
Co-authored-by: Joe <cuchac@email.cz>
1 parent 37b0eeb commit 6621e8e

File tree

4 files changed

+66
-15
lines changed

4 files changed

+66
-15
lines changed

src/Symfony/Component/Debug/ErrorHandler.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,15 +517,20 @@ public function handleError($type, $message, $file, $line)
517517
$errorAsException ? ['exception' => $errorAsException] : [],
518518
];
519519
} else {
520+
if (!$hhvm = \defined('HHVM_VERSION')) {
521+
$currentErrorHandler = set_error_handler('var_dump');
522+
restore_error_handler();
523+
}
524+
520525
try {
521526
$this->isRecursive = true;
522527
$level = ($type & $level) ? $this->loggers[$type][1] : LogLevel::DEBUG;
523528
$this->loggers[$type][0]->log($level, $logMessage, $errorAsException ? ['exception' => $errorAsException] : []);
524529
} finally {
525530
$this->isRecursive = false;
526531

527-
if (!\defined('HHVM_VERSION')) {
528-
set_error_handler([$this, __FUNCTION__]);
532+
if (!$hhvm) {
533+
set_error_handler($currentErrorHandler);
529534
}
530535
}
531536
}

src/Symfony/Component/Debug/Tests/ErrorHandlerTest.php

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\Debug\BufferingLogger;
1919
use Symfony\Component\Debug\ErrorHandler;
2020
use Symfony\Component\Debug\Exception\SilencedErrorContext;
21+
use Symfony\Component\Debug\Tests\Fixtures\ErrorHandlerThatUsesThePreviousOne;
2122
use Symfony\Component\Debug\Tests\Fixtures\LoggerThatSetAnErrorHandler;
2223

2324
/**
@@ -590,26 +591,40 @@ public function testCustomExceptionHandler()
590591
}
591592

592593
/**
593-
* @dataProvider errorHandlerIsNotLostWhenLoggingProvider
594+
* @dataProvider errorHandlerWhenLoggingProvider
594595
*/
595-
public function testErrorHandlerIsNotLostWhenLogging($customErrorHandlerHasBeenPreviouslyDefined, LoggerInterface $logger)
596+
public function testErrorHandlerWhenLogging($previousHandlerWasDefined, $loggerSetsAnotherHandler, $nextHandlerIsDefined)
596597
{
597598
try {
598-
if ($customErrorHandlerHasBeenPreviouslyDefined) {
599+
if ($previousHandlerWasDefined) {
599600
set_error_handler('count');
600601
}
601602

603+
$logger = $loggerSetsAnotherHandler ? new LoggerThatSetAnErrorHandler() : new NullLogger();
604+
602605
$handler = ErrorHandler::register();
603606
$handler->setDefaultLogger($logger);
604607

608+
if ($nextHandlerIsDefined) {
609+
$handler = ErrorHandlerThatUsesThePreviousOne::register();
610+
}
611+
605612
@trigger_error('foo', E_USER_DEPRECATED);
606613
@trigger_error('bar', E_USER_DEPRECATED);
607614

608615
$this->assertSame([$handler, 'handleError'], set_error_handler('var_dump'));
609616

617+
if ($logger instanceof LoggerThatSetAnErrorHandler) {
618+
$this->assertCount(2, $logger->cleanLogs());
619+
}
620+
610621
restore_error_handler();
611622

612-
if ($customErrorHandlerHasBeenPreviouslyDefined) {
623+
if ($previousHandlerWasDefined) {
624+
restore_error_handler();
625+
}
626+
627+
if ($nextHandlerIsDefined) {
613628
restore_error_handler();
614629
}
615630
} finally {
@@ -618,13 +633,14 @@ public function testErrorHandlerIsNotLostWhenLogging($customErrorHandlerHasBeenP
618633
}
619634
}
620635

621-
public function errorHandlerIsNotLostWhenLoggingProvider()
636+
public function errorHandlerWhenLoggingProvider()
622637
{
623-
return [
624-
[false, new NullLogger()],
625-
[true, new NullLogger()],
626-
[false, new LoggerThatSetAnErrorHandler()],
627-
[true, new LoggerThatSetAnErrorHandler()],
628-
];
638+
foreach ([false, true] as $previousHandlerWasDefined) {
639+
foreach ([false, true] as $loggerSetsAnotherHandler) {
640+
foreach ([false, true] as $nextHandlerIsDefined) {
641+
yield [$previousHandlerWasDefined, $loggerSetsAnotherHandler, $nextHandlerIsDefined];
642+
}
643+
}
644+
}
629645
}
630646
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace Symfony\Component\Debug\Tests\Fixtures;
4+
5+
class ErrorHandlerThatUsesThePreviousOne
6+
{
7+
private static $previous;
8+
9+
public static function register()
10+
{
11+
$handler = new static();
12+
13+
self::$previous = set_error_handler([$handler, 'handleError']);
14+
15+
return $handler;
16+
}
17+
18+
public function handleError($type, $message, $file, $line, $context)
19+
{
20+
return call_user_func(
21+
self::$previous,
22+
$type,
23+
$message,
24+
$file,
25+
$line,
26+
$context
27+
);
28+
}
29+
}

src/Symfony/Component/Debug/Tests/Fixtures/LoggerThatSetAnErrorHandler.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
namespace Symfony\Component\Debug\Tests\Fixtures;
44

5-
use Psr\Log\AbstractLogger;
5+
use Symfony\Component\Debug\BufferingLogger;
66

7-
class LoggerThatSetAnErrorHandler extends AbstractLogger
7+
class LoggerThatSetAnErrorHandler extends BufferingLogger
88
{
99
public function log($level, $message, array $context = [])
1010
{
1111
set_error_handler('is_string');
12+
parent::log($level, $message, $context);
1213
restore_error_handler();
1314
}
1415
}

0 commit comments

Comments
 (0)