Skip to content

Commit 94d99f6

Browse files
committed
[HttpKernel] Enhance exception if possible
1 parent 6c85287 commit 94d99f6

File tree

4 files changed

+32
-15
lines changed

4 files changed

+32
-15
lines changed

src/Symfony/Component/ErrorHandler/ErrorHandler.php

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -516,14 +516,7 @@ public function handleException(\Throwable $exception): void
516516
}
517517
}
518518

519-
if (!$exception instanceof OutOfMemoryError) {
520-
foreach ($this->getErrorEnhancers() as $errorEnhancer) {
521-
if ($e = $errorEnhancer->enhance($exception)) {
522-
$exception = $e;
523-
break;
524-
}
525-
}
526-
}
519+
$exception = self::enhanceError($exception);
527520

528521
$exceptionHandler = $this->exceptionHandler;
529522
$this->exceptionHandler = [$this, 'renderException'];
@@ -661,12 +654,27 @@ private function renderException(\Throwable $exception): void
661654
echo $exception->getAsString();
662655
}
663656

657+
public static function enhanceError(\Throwable $exception): \Throwable
658+
{
659+
if ($exception instanceof OutOfMemoryError) {
660+
return $exception;
661+
}
662+
663+
foreach (self::getErrorEnhancers() as $errorEnhancer) {
664+
if ($e = $errorEnhancer->enhance($exception)) {
665+
return $e;
666+
}
667+
}
668+
669+
return $exception;
670+
}
671+
664672
/**
665673
* Override this method if you want to define more error enhancers.
666674
*
667675
* @return ErrorEnhancerInterface[]
668676
*/
669-
protected function getErrorEnhancers(): iterable
677+
protected static function getErrorEnhancers(): iterable
670678
{
671679
return [
672680
new UndefinedFunctionErrorEnhancer(),

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,13 +363,14 @@ public function testHandleDeprecation()
363363
/**
364364
* @dataProvider handleExceptionProvider
365365
*/
366-
public function testHandleException(string $expectedMessage, \Throwable $exception)
366+
public function testHandleException(string $expectedMessage, \Throwable $exception, string $enhancedMessage = null)
367367
{
368368
try {
369369
$logger = $this->createMock(LoggerInterface::class);
370370
$handler = ErrorHandler::register();
371371

372372
$logArgCheck = function ($level, $message, $context) use ($expectedMessage, $exception) {
373+
$this->assertSame('critical', $level);
373374
$this->assertSame($expectedMessage, $message);
374375
$this->assertArrayHasKey('exception', $context);
375376
$this->assertInstanceOf($exception::class, $context['exception']);
@@ -388,11 +389,13 @@ public function testHandleException(string $expectedMessage, \Throwable $excepti
388389
$handler->handleException($exception);
389390
$this->fail('Exception expected');
390391
} catch (\Throwable $e) {
391-
$this->assertSame($exception, $e);
392+
$this->assertInstanceOf($exception::class, $e);
393+
$this->assertSame($enhancedMessage ?? $exception->getMessage(), $e->getMessage());
392394
}
393395

394-
$handler->setExceptionHandler(function ($e) use ($exception) {
395-
$this->assertSame($exception, $e);
396+
$handler->setExceptionHandler(function ($e) use ($exception, $enhancedMessage) {
397+
$this->assertInstanceOf($exception::class, $e);
398+
$this->assertSame($enhancedMessage ?? $exception->getMessage(), $e->getMessage());
396399
});
397400

398401
$handler->handleException($exception);
@@ -412,6 +415,11 @@ public static function handleExceptionProvider(): array
412415
})::class.' bar')],
413416
['Uncaught Error: bar', new \Error('bar')],
414417
['Uncaught ccc', new \ErrorException('ccc')],
418+
[
419+
'Uncaught Error: Class "App\Controller\ClassDoesNotExist" not found',
420+
new \Error('Class "App\Controller\ClassDoesNotExist" not found'),
421+
"Attempted to load class \"ClassDoesNotExist\" from namespace \"App\Controller\".\nDid you forget a \"use\" statement for another namespace?",
422+
],
415423
];
416424
}
417425

src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Psr\Log\LoggerInterface;
1515
use Psr\Log\LogLevel;
16+
use Symfony\Component\ErrorHandler\ErrorHandler;
1617
use Symfony\Component\ErrorHandler\Exception\FlattenException;
1718
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1819
use Symfony\Component\HttpFoundation\Request;
@@ -101,7 +102,7 @@ public function onKernelException(ExceptionEvent $event)
101102
return;
102103
}
103104

104-
$throwable = $event->getThrowable();
105+
$throwable = ErrorHandler::enhanceError($event->getThrowable());
105106
$request = $this->duplicateRequest($throwable, $event->getRequest());
106107

107108
try {

src/Symfony/Component/HttpKernel/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"require": {
1919
"php": ">=8.1",
2020
"symfony/deprecation-contracts": "^2.5|^3",
21-
"symfony/error-handler": "^6.3|^7.0",
21+
"symfony/error-handler": "^6.4|^7.0",
2222
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
2323
"symfony/http-foundation": "^6.2.7|^7.0",
2424
"symfony/polyfill-ctype": "^1.8",

0 commit comments

Comments
 (0)