phalcon異常處理

開發狀況下 ,有異常直接拋出,方便調試。而在生產環境則不能暴露異常信息,此時須要對異常進行攔截並顯示友好頁面。app

兩種方式捕獲異常:spa

  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頁面。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組件渲染對應的模板,最終輸出內容。事件

相關文章
相關標籤/搜索