From afb6e1ec9ebe5e60cdcb660667ada2bc83fe6bcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Pineau?= Date: Sat, 18 May 2019 15:32:47 +0200 Subject: [PATCH] [Debug] Wrap call to require_once in a try/catch If the included file contains an error, it hides the real error. This makes debugging harder. How to reproduce: ``` composer create-project symfony/skeleton symfony-3.4 3.4 cd symfony-3.4 composer req monolog ``` Add to `monolog.yaml`: ```yaml elasticsearch: type: "elasticsearch" elasticsearch: host: 'elasticsearch' port: '9200' index: 'ep_php_logs_dev' level: 'debug' tags: 'monolog.logger' channels: ['!event'] ``` This will fail because the the \Elastica\Client class does not exist. But this error will be hidden by the `ClassNotFoundFatalErrorHandler` because it will try to load the `Symfony\Component\Kernel\Client` and this class extends `Symfony\Component\BrowserKit\Client`. The last one is a soft dependency... --- Before ``` Fatal error: Uncaught Error: Class 'Symfony\Component\BrowserKit\Client' not found in /tmp/symfony-3.4/vendor/symfony/http-kernel/Client.php:31 ``` After: ``` Fatal error: Uncaught Symfony\Component\Debug\Exception\ClassNotFoundException: Attempted to load class "Client" from namespace "Elastica". Did you forget a "use" statement for another namespace? in /tmp/symfony-es/var/cache/dev/ContainerWXN4mS9/srcApp_KernelDevDebugContainer.php:303 ``` --- .../FatalErrorHandler/ClassNotFoundFatalErrorHandler.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php b/src/Symfony/Component/Debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php index 1ac18ac8f565..45dcc00d5cb6 100644 --- a/src/Symfony/Component/Debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php +++ b/src/Symfony/Component/Debug/FatalErrorHandler/ClassNotFoundFatalErrorHandler.php @@ -185,7 +185,11 @@ private function convertFileToClass($path, $file, $prefix) } } - require_once $file; + try { + require_once $file; + } catch (\Throwable $e) { + return null; + } foreach ($candidates as $candidate) { if ($this->classExists($candidate)) {