開發狀況下 ,有異常直接拋出,方便調試。而在生產環境則不能暴露異常信息,此時須要對異常進行攔截並顯示友好頁面。app
兩種方式捕獲異常:spa
經過一個簡單的例子來展現一下:調試
use Phalcon\Dispatcher; use Phalcon\Mvc\Dispatcher as MvcDispatcher; use Phalcon\Events\Manager as EventsManager; use Phalcon\Mvc\Dispatcher\Exception as DispatchException; //調度器 $di->setShared('dispatcher',function(){ // 建立一個事件管理 $eventsManager = new EventsManager(); // 附上一個偵聽者 $eventsManager->attach("dispatch:beforeException", function ($event, $dispatcher, $exception) { //非開發模式,攔截異常並處理 if (!APP_DEBUG) { switch ($exception->getCode()) { //控制器或動做不存在的時候 case Dispatcher::EXCEPTION_HANDLER_NOT_FOUND: case Dispatcher::EXCEPTION_ACTION_NOT_FOUND: $dispatcher->forward( array( 'controller' => 'error', 'action' => 'show404' ) ); break; default: $dispatcher->forward( array( 'controller' => 'error', 'action' => 'show500' ) ); } return false; } }); $dispatcher = new MvcDispatcher(); // 將EventsManager綁定到調度器 $dispatcher->setEventsManager($eventsManager); return $dispatcher; });
能夠根據異常code,也能夠根據異常類型來做不一樣的處理。好比咱們本身能夠添加一個 HttpException 異常,而後根據狀態碼顯示403 404 400 錯誤頁面等等,其餘內部錯誤就直接顯示500頁面。code
2.在入口腳本try..catch直接處理對象
try { //.... echo $application->handle()->getContent(); }catch(\Exception $e) { if (APP_DEBUG) { echo $e; } else { if ($e instanceof Phalcon\Mvc\Dispatcher\Exception) { echo $application->response ->setStatusCode(404)->sendHeaders() ->setContent($application->view->start()->render('error','show404')->finish()->getContent())->getContent(); } else { echo $application->response ->setStatusCode(500)->sendHeaders() ->setContent($application->view->start()->render('error','show500')->finish()->getContent())->getContent(); } } }
代碼有點複雜,但邏輯很清晰,就是調用 response對象,設定header頭,而後經過view組件渲染對應的模板,最終輸出內容。事件