开发情况下 ,有异常直接抛出,方便调试。而在生产环境则不能暴露异常信息,此时需要对异常进行拦截并显示友好页面。
两种方式捕获异常:
- 通过dispatcher事件
通过一个简单的例子来展示一下:
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页面。
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组件渲染对应的模板,最终输出内容。