/** * @param Exception * @return void */ public function renderDefault($exception) { if ($this->isAjax()) { // AJAX request? Just note this error in payload. $this->payload->error = TRUE; $this->terminate(); } elseif ($exception instanceof NBadRequestException) { $code = $exception->getCode(); // load template 403.latte or 404.latte or ... 4xx.latte $this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx'); // log to access.log NDebugger::log("HTTP code {$code}: {$exception->getMessage()} in {$exception->getFile()}:{$exception->getLine()}", 'access'); } else { $this->setView('500'); // load template 500.latte NDebugger::log($exception, NDebugger::ERROR); // and log exception } }
/** * Dispatch a HTTP request to a front controller. * @return void */ public function run() { $request = NULL; $repeatedError = FALSE; do { try { if (count($this->requests) > self::$maxLoop) { throw new NApplicationException('Too many loops detected in application life cycle.'); } if (!$request) { $this->onStartup($this); $request = $this->router->match($this->httpRequest); if (!$request instanceof NPresenterRequest) { $request = NULL; throw new NBadRequestException('No route for HTTP request.'); } if (strcasecmp($request->getPresenterName(), $this->errorPresenter) === 0) { throw new NBadRequestException('Invalid request. Presenter is not achievable.'); } } $this->requests[] = $request; $this->onRequest($this, $request); // Instantiate presenter $presenterName = $request->getPresenterName(); try { $this->presenter = $this->presenterFactory->createPresenter($presenterName); } catch (NInvalidPresenterException $e) { throw new NBadRequestException($e->getMessage(), 404, $e); } $this->presenterFactory->getPresenterClass($presenterName); $request->setPresenterName($presenterName); $request->freeze(); // Execute presenter $response = $this->presenter->run($request); if ($response) { $this->onResponse($this, $response); } // Send response if ($response instanceof NForwardResponse) { $request = $response->getRequest(); continue; } elseif ($response instanceof IPresenterResponse) { $response->send($this->httpRequest, $this->httpResponse); } break; } catch (Exception $e) { // fault barrier $this->onError($this, $e); if (!$this->catchExceptions) { $this->onShutdown($this, $e); throw $e; } if ($repeatedError) { $e = new NApplicationException('An error occurred while executing error-presenter', 0, $e); } if (!$this->httpResponse->isSent()) { $this->httpResponse->setCode($e instanceof NBadRequestException ? $e->getCode() : 500); } if (!$repeatedError && $this->errorPresenter) { $repeatedError = TRUE; if ($this->presenter instanceof NPresenter) { try { $this->presenter->forward(":$this->errorPresenter:", array('exception' => $e)); } catch (NAbortException $foo) { $request = $this->presenter->getLastCreatedRequest(); } } else { $request = new NPresenterRequest( $this->errorPresenter, NPresenterRequest::FORWARD, array('exception' => $e) ); } // continue } else { // default error handler if ($e instanceof NBadRequestException) { $code = $e->getCode(); } else { $code = 500; NDebugger::log($e, NDebugger::ERROR); } require dirname(__FILE__) . '/templates/error.phtml'; break; } } } while (1); $this->onShutdown($this, isset($e) ? $e : NULL); }