Skip to content

Commit 7312206

Browse files
committed
feature #50911 [HttpKernel] Enhance exception if possible (lyrixx)
This PR was merged into the 6.4 branch. Discussion ---------- [HttpKernel] Enhance exception if possible | Q | A | ------------- | --- | Branch? | 6.4 | Bug fix? | no | New feature? | restore an old feature | Deprecations? | no | Tickets | | License | MIT | Doc PR | I don't know if it's the best place to do that. I think in the kernel, it would be better, WDYT? Before ![image](https://github.com/symfony/symfony/assets/408368/e2a452aa-b669-4598-8b23-5366c5b80a74) After : ![image](https://github.com/symfony/symfony/assets/408368/0e30c50d-5c94-43db-a9e5-19be6ccd5f2b) Commits ------- 2bfb9d9128 [HttpKernel] Enhance exception if possible
2 parents 75a3586 + 1de20c4 commit 7312206

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

ErrorHandler.php

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -517,14 +517,7 @@ public function handleException(\Throwable $exception): void
517517
}
518518
}
519519

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

529522
$exceptionHandler = $this->exceptionHandler;
530523
$this->exceptionHandler = [$this, 'renderException'];
@@ -662,6 +655,21 @@ private function renderException(\Throwable $exception): void
662655
echo $exception->getAsString();
663656
}
664657

658+
public function enhanceError(\Throwable $exception): \Throwable
659+
{
660+
if ($exception instanceof OutOfMemoryError) {
661+
return $exception;
662+
}
663+
664+
foreach ($this->getErrorEnhancers() as $errorEnhancer) {
665+
if ($e = $errorEnhancer->enhance($exception)) {
666+
return $e;
667+
}
668+
}
669+
670+
return $exception;
671+
}
672+
665673
/**
666674
* Override this method if you want to define more error enhancers.
667675
*

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

0 commit comments

Comments
 (0)