2016-03-01 107 views
4

我想知道,在Phalcon中處理異常的最佳方法是什麼?我想爲發生錯誤時創建一個默認錯誤頁面。所以我改寫/app/public/index.html這樣:在phalcon中處理全局異常

<?php 

error_reporting(E_ALL); 

try { 
    /** 
    * Define some useful constants 
    */ 
    define('BASE_DIR', dirname(__DIR__)); 
    define('APP_DIR', BASE_DIR . '/app'); 

    require_once __DIR__ . '/../vendor/autoload.php'; 


    /** 
    * Read the configuration 
    */ 
    $config = include APP_DIR . '/config/config.php'; 

    /** 
    * Read auto-loader 
    */ 
    include APP_DIR . '/config/loader.php'; 

    /** 
    * Read services 
    */ 
    include APP_DIR . '/config/services.php'; 

    /** 
    * Handle the request 
    */ 
    $application = new \Phalcon\Mvc\Application($di); 

    echo $application->handle()->getContent(); 
} catch (Exception $e) { 
    echo 'This is where I want my handling to be'; 
} 

然而,當錯誤被拋出,我不斷收到預設的Chrome 500錯誤窗口。該錯誤記錄到OS X的錯誤控制檯,但我沒有看到我的回聲。我究竟做錯了什麼?

+0

這是啓動應用程序並捕獲異常的正確方法。 **你想要捕捉什麼類型的錯誤?**例如,如果你將db密碼更改爲不正確的密碼,你的代碼將會工作。但是,如果你犯了一個解析錯誤,它將不會被捕獲。 –

回答

2

使用多個catch塊,而不是僅僅\異常添加特定類型的例外像\ PDOException

try 
{ 
/* something */ 
} 
catch(\Exception $e) 
{ 
    handler1($e); 
} 
catch (\PDOException $b) 
{ 
    handler2($e); 
} 
// add more ex here 

你說:「當出現錯誤」,如果你要處理錯誤,然後在上面添加錯誤處理程序Phalcon bootstrap(public/index.php)文件。

function handleError($errno, $errstr) { 
    echo "<b>Error:</b> [$errno] $errstr<br>"; 
    //do what ever 
    die(); 
} 
set_error_handler("handleError"); 
0

如果你想顯示你需要改變這一行你php.ini文件中的PHP解析錯誤:

display_errors = on 

您可能需要重新啓動你的web服務器,此更改生效。


如果您不能確定在ini文件所在,輸出下面的一行代碼:

<?php phpinfo(INFO_GENERAL) ?> 

這應該顯示php.ini文件


的位置另一個注意事項。捕捉這樣的錯誤並不是一個好習慣。 Phalcon提供了不同的方式來捕捉錯誤。

$eventsManager->attach('dispatch:beforeException', new NotFoundPlugin); 

有關完整示例,請參閱the Phalcon INVO repository

0

在app /配置/ service.php

use \Phalcon\Mvc\Dispatcher as PhDispatcher; 

. 
. 
. 


$di->set(
'dispatcher', 
function() use ($di) { 

    $evManager = $di->getShared('eventsManager'); 

    $evManager->attach(
     "dispatch:beforeException", 
     function($event, $dispatcher, $exception) 
     { 
      switch ($exception->getCode()) { 
       case PhDispatcher::EXCEPTION_HANDLER_NOT_FOUND: 
       case PhDispatcher::EXCEPTION_ACTION_NOT_FOUND: 

        $dispatcher->forward(
         array(
          'namespace' => 'App\Controllers\Web', 
          'controller' => 'error', 
          'action'  => 'show404', 
         ) 
        ); 
        return false; 
      } 
     } 
    ); 
    $dispatcher = new PhDispatcher(); 
    $dispatcher->setEventsManager($evManager); 
    return $dispatcher; 
}, 
true 

);