diff --git a/src/App.php b/src/App.php index 2c3d1f58..38213b85 100755 --- a/src/App.php +++ b/src/App.php @@ -575,7 +575,9 @@ public function execute(Route $route, Request $request): self } } } - } catch (\Throwable $e) { + } catch (\Throwable $e) {; + $errorHandled = false; + foreach ($groups as $group) { foreach (self::$errors as $error) { // Group error hooks /** @var Hook $error */ @@ -586,6 +588,7 @@ public function execute(Route $route, Request $request): self try { $arguments = $this->getArguments($error, $values, $request->getParams()); \call_user_func_array($error->getAction(), $arguments); + $errorHandled = true; } catch (\Throwable $e) { throw new Exception('Error handler had an error', 0, $e); } @@ -602,11 +605,23 @@ public function execute(Route $route, Request $request): self try { $arguments = $this->getArguments($error, $values, $request->getParams()); \call_user_func_array($error->getAction(), $arguments); + $errorHandled = true; } catch (\Throwable $e) { throw new Exception('Error handler had an error', 0, $e); } } } + + if (!$errorHandled) { + $response = $this->getResource('response'); + $response->setStatusCode(500); + $response->json([ + 'message' => $e->getMessage(), + 'stacktrace' => $e->getTrace() + ]); + \fwrite(STDERR, "\033[31mException: " . $e->getMessage() . "\033[0m\n"); + \fwrite(STDERR, "Stacktrace: \n" . $e->getTraceAsString() . "\n"); + } } return $this; @@ -728,6 +743,7 @@ public function run(Request $request, Response $response): self } } } catch (\Throwable $e) { + $errorHandled = false; foreach (self::$errors as $error) { // Global error hooks /** @var Hook $error */ if(in_array('*', $error->getGroups())) { @@ -735,10 +751,22 @@ public function run(Request $request, Response $response): self return $e; }); \call_user_func_array($error->getAction(), $this->getArguments($error, [], $request->getParams())); + $errorHandled = true; } } + + if (!$errorHandled) { + $response->setStatusCode(500); + $response->json([ + 'message' => $e->getMessage(), + 'stacktrace' => $e->getTrace() + ]); + \fwrite(STDERR, "\033[31mException: " . $e->getMessage() . "\033[0m\n"); + \fwrite(STDERR, "Stacktrace: \n" . $e->getTraceAsString() . "\n"); + } } } else { + $errorHandled = false; foreach (self::$errors as $error) { // Global error hooks /** @var Hook $error */ if(in_array('*', $error->getGroups())) { @@ -746,8 +774,17 @@ public function run(Request $request, Response $response): self return new Exception('Not Found', 404); }); \call_user_func_array($error->getAction(), $this->getArguments($error, [], $request->getParams())); + $errorHandled = true; } } + + if (!$errorHandled) { + $response->setStatusCode(404); + $response->json([ + 'message' => 'Not Found' + ]); + \fwrite(STDERR, "\033[31mException: " . 'Route not found' . "\033[0m\n"); + } } return $this; diff --git a/tests/e2e/Client.php b/tests/e2e/Client.php index 19a70d8e..0db6a5ce 100644 --- a/tests/e2e/Client.php +++ b/tests/e2e/Client.php @@ -83,10 +83,6 @@ public function call(string $method, string $path = '', array $headers = [], arr $responseHeaders['status-code'] = $responseStatus; - if ($responseStatus === 500) { - echo 'Server error('.$method.': '.$path.'. Params: '.json_encode($params).'): '.json_encode($responseBody)."\n"; - } - return [ 'headers' => $responseHeaders, 'body' => $responseBody diff --git a/tests/e2e/ResponseTest.php b/tests/e2e/ResponseTest.php index a23b15a3..2190a818 100644 --- a/tests/e2e/ResponseTest.php +++ b/tests/e2e/ResponseTest.php @@ -39,4 +39,16 @@ public function testRedirect() $response = $this->client->call(Client::METHOD_GET, '/redirect'); $this->assertEquals('Hello World!', $response['body']); } + + public function testException() + { + $response = $this->client->call(Client::METHOD_GET, '/exception'); + $this->assertEquals(500, $response['headers']['status-code']); + } + + public function testHandledException() + { + $response = $this->client->call(Client::METHOD_GET, '/handledException'); + $this->assertEquals('Handled Exception.', $response['body']); + } } diff --git a/tests/e2e/server.php b/tests/e2e/server.php index e9d900b8..ad91aa6b 100644 --- a/tests/e2e/server.php +++ b/tests/e2e/server.php @@ -34,6 +34,26 @@ $response->redirect('/'); }); +App::get('/exception') + ->inject('response') + ->action(function($response) { + /** @var Utopia/Response $response */ + throw new Exception('Exception!'); + }); + +App::get('/handledException') + ->inject('response') + ->action(function($response) { + /** @var Utopia/Response $response */ + + App::error(function ($error, $response) { + /** @var Utopia/Response $response */ + $response->send('Handled Exception.'); + }, ['error', 'response']); + + throw new Exception('Exception!'); + }); + $request = new Request(); $response = new Response();