[!!!][TASK] Add typehint \Throwable in ExceptionHandlerInterface 10/46910/2
authorAlexander Opitz <opitz.alexander@googlemail.com>
Fri, 26 Feb 2016 13:39:35 +0000 (14:39 +0100)
committerFrank Naegler <frank.naegler@typo3.org>
Fri, 26 Feb 2016 17:23:30 +0000 (18:23 +0100)
After switching to support only PHP 7.0 we readd type hinting in
ExceptionHandlerInterface which was removed while supporting older PHP
versions in previous TYPO3 versions.

Resolves: #72293
Related: #72117
Releases: master
Change-Id: I5e656add061518eaf2739e47227d6c666d412dfe
Reviewed-on: https://review.typo3.org/46910
Reviewed-by: Mathias Brodala <mbrodala@pagemachine.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Frank Naegler <frank.naegler@typo3.org>
Tested-by: Frank Naegler <frank.naegler@typo3.org>
typo3/sysext/backend/Classes/Console/CliRequestHandler.php
typo3/sysext/core/Classes/Error/AbstractExceptionHandler.php
typo3/sysext/core/Classes/Error/DebugExceptionHandler.php
typo3/sysext/core/Classes/Error/ExceptionHandlerInterface.php
typo3/sysext/core/Classes/Error/ProductionExceptionHandler.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-72293-APIChangeInExceptionHandlerInterface.rst [new file with mode: 0644]

index 17d2d34..671cd01 100755 (executable)
@@ -85,9 +85,6 @@ class CliRequestHandler implements RequestHandlerInterface
         } catch (\RuntimeException $e) {
             $output->writeln('<error>Oops, an error occurred: ' . $e->getMessage() . '</error>');
             $exitCode = $e->getCode();
-        } catch (\Exception $e) {
-            $output->writeln('<error>Oops, an error occurred: ' . $e->getMessage() . '</error>');
-            $exitCode = $e->getCode();
         } catch (\Throwable $e) {
             $output->writeln('<error>Oops, an error occurred: ' . $e->getMessage() . '</error>');
             $exitCode = $e->getCode();
index b7148e0..a3f06e9 100644 (file)
@@ -29,36 +29,30 @@ abstract class AbstractExceptionHandler implements ExceptionHandlerInterface, \T
     /**
      * Displays the given exception
      *
-     * @param \Exception|\Throwable $exception The exception(PHP 5.x) or throwable(PHP >= 7.0) object.
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
+     * @param \Throwable $exception The throwable object.
      *
      * @throws \Exception
      */
-    public function handleException($exception)
+    public function handleException(\Throwable $exception)
     {
-        if ($exception instanceof \Throwable || $exception instanceof \Exception) {
-            switch (PHP_SAPI) {
-                case 'cli':
-                    $this->echoExceptionCLI($exception);
-                    break;
-                default:
-                    $this->echoExceptionWeb($exception);
-            }
-        } else {
-            throw new \Exception('handleException was called the wrong way.', 1450714322);
+        switch (PHP_SAPI) {
+            case 'cli':
+                $this->echoExceptionCLI($exception);
+                break;
+            default:
+                $this->echoExceptionWeb($exception);
         }
     }
 
     /**
      * Writes exception to different logs
      *
-     * @param \Exception|\Throwable $exception The exception(PHP 5.x) or throwable(PHP >= 7.0) object.
+     * @param \Throwable $exception The throwable object.
      * @param string $context The context where the exception was thrown, WEB or CLI
      * @return void
      * @see \TYPO3\CMS\Core\Utility\GeneralUtility::sysLog(), \TYPO3\CMS\Core\Utility\GeneralUtility::devLog()
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    protected function writeLogEntries($exception, $context)
+    protected function writeLogEntries(\Throwable $exception, $context)
     {
         // Do not write any logs for this message to avoid filling up tables or files with illegal requests
         if ($exception->getCode() === 1396795884) {
@@ -139,11 +133,10 @@ abstract class AbstractExceptionHandler implements ExceptionHandlerInterface, \T
      * Sends the HTTP Status 500 code, if $exception is *not* a
      * TYPO3\CMS\Core\Error\Http\StatusException and headers are not sent, yet.
      *
-     * @param \Exception|\Throwable $exception The exception(PHP 5.x) or throwable(PHP >= 7.0) object.
+     * @param \Throwable $exception The throwable object.
      * @return void
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    protected function sendStatusHeaders($exception)
+    protected function sendStatusHeaders(\Throwable $exception)
     {
         if (method_exists($exception, 'getStatusHeaders')) {
             $headers = $exception->getStatusHeaders();
index d8c028e..9051121 100644 (file)
@@ -34,11 +34,10 @@ class DebugExceptionHandler extends AbstractExceptionHandler
     /**
      * Formats and echoes the exception as XHTML.
      *
-     * @param \Exception|\Throwable $exception The exception object
+     * @param \Throwable $exception The throwable object.
      * @return void
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    public function echoExceptionWeb($exception)
+    public function echoExceptionWeb(\Throwable $exception)
     {
         $this->sendStatusHeaders($exception);
         $filePathAndName = $exception->getFile();
@@ -113,21 +112,17 @@ class DebugExceptionHandler extends AbstractExceptionHandler
     /**
      * Formats and echoes the exception for the command line
      *
-     * @param \Exception|\Throwable $exception The exception object
+     * @param \Throwable $exception The throwable object.
      * @return void
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    public function echoExceptionCLI($exception)
+    public function echoExceptionCLI(\Throwable $exception)
     {
         $filePathAndName = $exception->getFile();
         $exceptionCodeNumber = $exception->getCode() > 0 ? '#' . $exception->getCode() . ': ' : '';
         $this->writeLogEntries($exception, self::CONTEXT_CLI);
-        echo '
-Uncaught TYPO3 Exception ' . $exceptionCodeNumber . $exception->getMessage() . LF;
+        echo LF . 'Uncaught TYPO3 Exception ' . $exceptionCodeNumber . $exception->getMessage() . LF;
         echo 'thrown in file ' . $filePathAndName . LF;
-        echo 'in line ' . $exception->getLine() . '
-
-';
+        echo 'in line ' . $exception->getLine() . LF . LF;
         die(1);
     }
 
index 97f1081..5d671be 100644 (file)
@@ -29,27 +29,24 @@ interface ExceptionHandlerInterface
     /**
      * Handles the given exception
      *
-     * @param \Exception|\Throwable $exception The exception(PHP 5.x) or throwable(PHP >= 7.0) object.
+     * @param \Throwable $exception The throwable object.
      * @return void
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    public function handleException($exception);
+    public function handleException(\Throwable $exception);
 
     /**
      * Formats and echoes the exception as XHTML.
      *
-     * @param \Exception|\Throwable $exception The exception(PHP 5.x) or throwable(PHP >= 7.0) object.
+     * @param \Throwable $exception The throwable object.
      * @return void
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    public function echoExceptionWeb($exception);
+    public function echoExceptionWeb(\Throwable $exception);
 
     /**
      * Formats and echoes the exception for the command line
      *
-     * @param \Exception|\Throwable $exception The exception(PHP 5.x) or throwable(PHP >= 7.0) object.
+     * @param \Throwable $exception The throwable object.
      * @return void
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    public function echoExceptionCLI($exception);
+    public function echoExceptionCLI(\Throwable $exception);
 }
index 926bd61..b90a013 100644 (file)
@@ -46,11 +46,10 @@ class ProductionExceptionHandler extends AbstractExceptionHandler
     /**
      * Echoes an exception for the web.
      *
-     * @param \Exception|\Throwable $exception The exception
+     * @param \Throwable $exception The throwable object.
      * @return void
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    public function echoExceptionWeb($exception)
+    public function echoExceptionWeb(\Throwable $exception)
     {
         $this->sendStatusHeaders($exception);
         $this->writeLogEntries($exception, self::CONTEXT_WEB);
@@ -65,32 +64,27 @@ class ProductionExceptionHandler extends AbstractExceptionHandler
     /**
      * Echoes an exception for the command line.
      *
-     * @param \Exception|\Throwable $exception The exception
+     * @param \Throwable $exception The throwable object.
      * @return void
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    public function echoExceptionCLI($exception)
+    public function echoExceptionCLI(\Throwable $exception)
     {
         $filePathAndName = $exception->getFile();
         $exceptionCodeNumber = $exception->getCode() > 0 ? '#' . $exception->getCode() . ': ' : '';
         $this->writeLogEntries($exception, self::CONTEXT_CLI);
-        echo '
-Uncaught TYPO3 Exception ' . $exceptionCodeNumber . $exception->getMessage() . LF;
+        echo LF . 'Uncaught TYPO3 Exception ' . $exceptionCodeNumber . $exception->getMessage() . LF;
         echo 'thrown in file ' . $filePathAndName . LF;
-        echo 'in line ' . $exception->getLine() . '
-
-';
+        echo 'in line ' . $exception->getLine() . LF . LF;
         die(1);
     }
 
     /**
      * Determines, whether Exception details should be outputted
      *
-     * @param \Exception|\Throwable $exception The exception
+     * @param \Throwable $exception The throwable object.
      * @return bool
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    protected function discloseExceptionInformation($exception)
+    protected function discloseExceptionInformation(\Throwable $exception)
     {
         // Allow message to be shown in production mode if the exception is about
         // trusted host configuration.  By doing so we do not disclose
@@ -113,11 +107,10 @@ Uncaught TYPO3 Exception ' . $exceptionCodeNumber . $exception->getMessage() . L
     /**
      * Returns the title for the error message
      *
-     * @param \Exception|\Throwable $exception Exception causing the error
+     * @param \Throwable $exception The throwable object.
      * @return string
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    protected function getTitle($exception)
+    protected function getTitle(\Throwable $exception)
     {
         if ($this->discloseExceptionInformation($exception) && method_exists($exception, 'getTitle') && $exception->getTitle() !== '') {
             return htmlspecialchars($exception->getTitle());
@@ -129,11 +122,10 @@ Uncaught TYPO3 Exception ' . $exceptionCodeNumber . $exception->getMessage() . L
     /**
      * Returns the message for the error message
      *
-     * @param \Exception|\Throwable $exception Exception causing the error
+     * @param \Throwable $exception The throwable object.
      * @return string
-     * @TODO #72293 This will change to \Throwable only if we are >= PHP7.0 only
      */
-    protected function getMessage($exception)
+    protected function getMessage(\Throwable $exception)
     {
         if ($this->discloseExceptionInformation($exception)) {
             // Exception has an error code given
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-72293-APIChangeInExceptionHandlerInterface.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-72293-APIChangeInExceptionHandlerInterface.rst
new file mode 100644 (file)
index 0000000..42c9361
--- /dev/null
@@ -0,0 +1,27 @@
+==========================================================
+Breaking: #72293 - API change in ExceptionHandlerInterface
+==========================================================
+
+Description
+===========
+
+The class \Throwable was added in PHP7 as new parent of \Exceptions. So we were in need to remove the type hint in #72117, which we now readd as \Throwable instead of \Exception as we only support PHP 7.0 or newer.
+See http://php.net/manual/en/migration70.incompatible.php
+
+
+Impact
+======
+
+A fatal error will be thrown if you use own ExceptionHandlers implementing TYPO3\CMS\Core\Error\ExceptionHandlerInterface "Fatal error: Declaration of ... must be compatible with ..."
+
+
+Affected Installations
+======================
+
+Installations which use an own ExceptionHandler implementing TYPO3s ExceptionHandlerInterface.
+
+
+Migration
+=========
+
+Add \Throwable as type hinting in your implementation of ExceptionHandlerInterface. So check the API/type hinting of the function were you process the exception.