調試應用程式(Debugging Applications)

來源:互聯網
上載者:User

標籤:調試   backtrac   需要   檔案   lsp   錯誤   調用   order   manual   

  調試應用程式(Debugging Applications)¶

Phalcon中提供了提供了幾種調試層級即通知,錯誤和異常。 異常類 Exception class 提供了錯誤發生時的一些常用的調試資訊如檔案,行,訊息,錯誤碼,跟蹤資訊等。 Phalcon主要使用這個異常類來封裝這些功能,以方便開發人員或使用者使用。

儘管Phalcon是使用C語言書寫的,但其依然如其它的PHP架構般提供了一些必須的調試工具,PHP本身提供的調試工具亦然可以正常使用。

捕獲異常(Catching Exceptions)¶

縱觀Phalcon的文檔及其提供的例子程式, 有一個最直接的捕獲異常的方法即是使用try/catch塊:

<?phptry {    // ... Some Phalcon/PHP code} catch (\Exception $e) {}

try/catch塊內發生的異常會被捕獲然後放入 $e 變數。 開發人員可以使用 Phalcon\Exception (擴充自 Exception class )來確定異常資訊是來自Phalcon還是PHP本身。 PHP產生的所有異常都是基於 Exception class , 且至少含有如下元素:

<?phpclass Exception{    /* Properties */    protected string $message;    protected int $code;    protected string $file;    protected int $line;    /* Methods */    public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]])    final public string getMessage ( void )    final public Exception getPrevious ( void )    final public mixed getCode ( void )    final public string getFile ( void )    final public int getLine ( void )    final public array getTrace ( void )    final public string getTraceAsString ( void )    public string __toString ( void )    final private void __clone ( void )}

如從 Exception class 中取得異常資訊一樣, 我也可以從 Phalcon\Exception 中取異常資訊。

<?phptry {    // ... App code ...} catch (\Exception $e) {    echo get_class($e), ": ", $e->getMessage(), "\n";    echo " File=", $e->getFile(), "\n";    echo " Line=", $e->getLine(), "\n";    echo $e->getTraceAsString();}

因此, 開發人員可以非常容易找出在哪個檔案中哪一行產生的異常資訊,也可以看到異常資訊涉及到的模組:

PDOException: SQLSTATE[28000] [1045] Access denied for user ‘root‘@‘localhost‘    (using password: NO) File=/Applications/MAMP/htdocs/invo/public/index.php Line=74#0 [internal function]: PDO->__construct(‘mysql:host=loca...‘, ‘root‘, ‘‘, Array)#1 [internal function]: Phalcon\Db\Adapter\Pdo->connect(Array)#2 /Applications/MAMP/htdocs/invo/public/index.php(74):    Phalcon\Db\Adapter\Pdo->__construct(Array)#3 [internal function]: {closure}()#4 [internal function]: call_user_func_array(Object(Closure), Array)#5 [internal function]: Phalcon\Di->_factory(Object(Closure), Array)#6 [internal function]: Phalcon\Di->get(‘db‘, Array)#7 [internal function]: Phalcon\Di->getShared(‘db‘)#8 [internal function]: Phalcon\Mvc\Model->getConnection()#9 [internal function]: Phalcon\Mvc\Model::_getOrCreateResultset(‘Users‘, Array, true)#10 /Applications/MAMP/htdocs/invo/app/controllers/SessionController.php(83):    Phalcon\Mvc\Model::findFirst(‘email=‘[email protected]‘)#11 [internal function]: SessionController->startAction()#12 [internal function]: call_user_func_array(Array, Array)#13 [internal function]: Phalcon\Mvc\Dispatcher->dispatch()#14 /Applications/MAMP/htdocs/invo/public/index.php(114): Phalcon\Mvc\Application->handle()#15 {main}

從上面我們可以看到異常資訊中有Phalcon的類及方法,甚至調用時的參數也顯示了出來。 如果需要可以使用 Exception::getTrace 擷取更多的資訊。

調試組件(Debug component)¶

Phalcon提供的調試組件可以使開發人員更容易的定位代碼中的錯誤。

下面的視頻中展示了如何工作的:

要開啟調試功能只需要如下做:

<?php$debug = new \Phalcon\Debug();$debug->listen();

注意一定要去掉Try/Catch塊才可以, 否則異常資訊不會正確的輸出(事實上很多時候Phalco顯示異常資訊是非常耗時的)。

反射與內省(Reflection and Introspection)¶

Phalcon的類的執行個體通常比一般的類執行個體更複雜。 這裡我們可以使用 ‘Reflection API’_ (反射機制) 或 直接列印其內部狀態來觀其究竟:

<?php$router = new Phalcon\Mvc\Router();print_r($router);

開發人員可以非常容易的觀察到對象內部的狀態。 上面的代碼輸出如下:

Phalcon\Mvc\Router Object(    [_dependencyInjector:protected] =>    [_module:protected] =>    [_controller:protected] =>    [_action:protected] =>    [_params:protected] => Array        (        )    [_routes:protected] => Array        (            [0] => Phalcon\Mvc\Router\Route Object                (                    [_pattern:protected] => #^/([a-zA-Z0-9\_]+)[/]{0,1}$#                    [_compiledPattern:protected] => #^/([a-zA-Z0-9\_]+)[/]{0,1}$#                    [_paths:protected] => Array                        (                            [controller] => 1                        )                    [_methods:protected] =>                    [_id:protected] => 0                    [_name:protected] =>                )            [1] => Phalcon\Mvc\Router\Route Object                (                    [_pattern:protected] => #^/([a-zA-Z0-9\_]+)/([a-zA-Z0-9\_]+)(/.*)*$#                    [_compiledPattern:protected] => #^/([a-zA-Z0-9\_]+)/([a-zA-Z0-9\_]+)(/.*)*$#                    [_paths:protected] => Array                        (                            [controller] => 1                            [action] => 2                            [params] => 3                        )                    [_methods:protected] =>                    [_id:protected] => 1                    [_name:protected] =>                )        )    [_matchedRoute:protected] =>    [_matches:protected] =>    [_wasMatched:protected] =>    [_defaultModule:protected] =>    [_defaultController:protected] =>    [_defaultAction:protected] =>    [_defaultParams:protected] => Array        (        ))
使用 XDebug(Using XDebug)¶

XDebug 是一個非常好(神奇)的調試工具,其和PHP內部調試工具一起為我們提調試工具(可以和PHP內建的調試工具互補)。 XDebug 也是一個PHP擴充, 所以二者可以一起使用,而且不需要額外的配置。

下面的視頻中展示了Phalcon中使用XDebug的情況:

一旦安裝了xdebug, 開發人員便可以使用其API來取得更多的異常資訊和其它資訊:

我們強烈推薦至少使用XDebug 2.2.3 以提供與Phalcon最佳的相容性。

下面的例子中調用了 xdebug_print_function_stack 方法, 並返回了該方法產生的代碼跟蹤結果:

<?phpuse Phalcon\Mvc\Controller;class SignupController extends Controller{    public function indexAction()    {    }    public function registerAction()    {        // Request variables from HTML form        $name  = $this->request->getPost("name", "string");        $email = $this->request->getPost("email", "email");        // Stop execution and show a backtrace        return xdebug_print_function_stack("stop here!");        $user        = new Users();        $user->name  = $name;        $user->email = $email;        // Store and check for errors        $user->save();    }}

這個例子中, XDebug顯示出了局部變數和代碼的跟蹤資訊:

Xdebug: stop here! in /Applications/MAMP/htdocs/tutorial/app/controllers/SignupController.php    on line 19Call Stack:    0.0383     654600   1. {main}() /Applications/MAMP/htdocs/tutorial/public/index.php:0    0.0392     663864   2. Phalcon\Mvc\Application->handle()        /Applications/MAMP/htdocs/tutorial/public/index.php:37    0.0418     738848   3. SignupController->registerAction()        /Applications/MAMP/htdocs/tutorial/public/index.php:0    0.0419     740144   4. xdebug_print_function_stack()        /Applications/MAMP/htdocs/tutorial/app/controllers/SignupController.php:19

使用xdebug我們可以使用若干種方法來取得關phalcon應用的調試資訊。更多信可以參看這裡的 XDebug documentation ( XDebug 文檔)。

調試應用程式(Debugging Applications)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.