phalcon异常处理
博客专区 > 吾爱 的博客 > 博客详情
phalcon异常处理
吾爱 发表于1年前
phalcon异常处理
  • 发表于 1年前
  • 阅读 104
  • 收藏 3
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

开发情况下 ,有异常直接抛出,方便调试。而在生产环境则不能暴露异常信息,此时需要对异常进行拦截并显示友好页面。

两种方式捕获异常:

  1. 通过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组件渲染对应的模板,最终输出内容。

标签: phalcon
共有 人打赏支持
粉丝 141
博文 253
码字总数 87728
×
吾爱
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: