[HttpKernel] Embed the original exception as previous to bounced exceptions

This commit is contained in:
Nicolas Grekas 2015-04-03 07:27:47 +02:00
parent 7dca9a9e5a
commit 40ab7ef349
2 changed files with 14 additions and 1 deletions

View File

@ -72,7 +72,18 @@ class ExceptionListener implements EventSubscriberInterface
// set handling to false otherwise it wont be able to handle further more
$handling = false;
// throwing $e, not $exception, is on purpose: fixing error handling code paths is the most important
$wrapper = $e;
while ($prev = $wrapper->getPrevious()) {
if ($exception === $wrapper = $prev) {
throw $e;
}
}
$prev = new \ReflectionProperty('Exception', 'previous');
$prev->setAccessible(true);
$prev->setValue($wrapper, $exception);
throw $e;
}

View File

@ -57,6 +57,7 @@ class ExceptionListenerTest extends \PHPUnit_Framework_TestCase
$this->fail('RuntimeException expected');
} catch (\RuntimeException $e) {
$this->assertSame('bar', $e->getMessage());
$this->assertSame('foo', $e->getPrevious()->getMessage());
}
}
@ -77,6 +78,7 @@ class ExceptionListenerTest extends \PHPUnit_Framework_TestCase
$this->fail('RuntimeException expected');
} catch (\RuntimeException $e) {
$this->assertSame('bar', $e->getMessage());
$this->assertSame('foo', $e->getPrevious()->getMessage());
}
$this->assertEquals(3, $logger->countErrors());