开发状况下 ,有异常直接抛出,方便调试。而在生产环境则不能暴露异常信息,此时须要对异常进行拦截并显示友好页面。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组件渲染对应的模板,最终输出内容。事件