Browse Source

Instead of triggering a fatal error, modify the response.

Modify the response with a text response and log an error when rendering
an error page.
Mark Story 10 years ago
parent
commit
50dabaeeb8

+ 9 - 3
src/Http/Middleware/ErrorHandlerMiddleware.php

@@ -15,8 +15,8 @@
 namespace Cake\Http\Middleware;
 
 use Cake\Core\App;
+use Cake\Log\Log;
 use Cake\Http\ResponseTransformer;
-use Exception;
 
 /**
  * Error handling middleware.
@@ -68,14 +68,19 @@ class ErrorHandlerMiddleware
         try {
             $response = $renderer->render();
             return ResponseTransformer::toPsr($response);
-        } catch (Exception $e) {
+        } catch (\Exception $e) {
             $message = sprintf(
                 "[%s] %s\n%s", // Keeping same message format
                 get_class($e),
                 $e->getMessage(),
                 $e->getTraceAsString()
             );
-            trigger_error($message, E_USER_ERROR);
+            Log::error($message);
+
+            $body = $response->getBody();
+            $body->write('An Internal Server Error Occurred');
+            $response = $response->withStatus(500)
+                ->withBody($body);
         }
         return $response;
     }
@@ -85,6 +90,7 @@ class ErrorHandlerMiddleware
      *
      * @param \Exception $exception The exception being rendered.
      * @return \Cake\Error\BaseErrorHandler The exception renderer.
+     * @throws \Exception When the renderer class cannot be found.
      */
     protected function getRenderer($exception)
     {

+ 3 - 2
tests/TestCase/Http/Middleware/ErrorHandlerMiddlewareTest.php

@@ -114,7 +114,6 @@ class ErrorHandlerMiddlewareTest extends TestCase
     /**
      * Test handling an error and having rendering fail.
      *
-     * @expectedException PHPUnit_Framework_Error
      * @return void
      */
     public function testHandleExceptionRenderingFails()
@@ -135,6 +134,8 @@ class ErrorHandlerMiddlewareTest extends TestCase
         $next = function ($req, $res) {
             throw new \Cake\Network\Exception\ServiceUnavailableException('whoops');
         };
-        $middleware($request, $response, $next);
+        $response = $middleware($request, $response, $next);
+        $this->assertEquals(500, $response->getStatusCode());
+        $this->assertEquals('An Internal Server Error Occurred', '' . $response->getBody());
     }
 }