Codeigniter Error Handling and Stack Tracing

參考連結

http://phpandi.blogspot.com/2010/04/codeigniter-error-handling-and-stack.html

我先前使用ASP.NET開發網頁,在程式出錯時,系統會列出程式的stack trace,可以很方便找到出錯的地方。最近使用PHP的CodeIgniter框架開發程式,也想要有這功能。在網上稍微搜尋一下,很幸運的找到答案。程式如下,用自訂的MY_Exceptions 取代原來的 CI_Exceptions。隨著 CI 的版本不同,此程式的位置稍有不同。以寫此文章時的最新版本,CI-2.1.0為例,MY_Exceptions.php 的位置是 application/core。

<?php
  class MY_Exceptions extends CI_Exceptions {
    public function __construct() {
       parent::__construct();
    }
   public function show_error($heading, $message,
                              $template = 'error_general',
                              $status_code = 500) {
      try {
       $str = parent::show_error($heading, $message,
                                 $template = 'error_general',
                                 $status_code = 500);
       throw new Exception($str);
      } catch (Exception $e) {
       $msg = $e->getMessage();
       $trace = "<h1>Call Trace</h1><pre>". $e->getTraceAsString(). "<pre>";
       //append our stack trace to the error message
       $err = str_replace('</div>', $trace.'</div>', $msg);
       echo $err;
     }
  }
}

嗯,在你在程式中呼叫下面的函式時

show_error('Error in query preparation/execution.');

錯誤訊息現在變成像下面這樣了,在程式開發時能夠更方便的除錯。但千萬記住,在正式的網站上,將這訊息拿掉。

An Error Was Encountered

Error in query preparation/execution.

Call Trace

#0 C:\CodeIgniter-2.1.0-system\core\Common.php(309): MY_Exceptions->show_error('An Error Was En...', 'Error in query ...', 'error_general', 500) #1 E:\FMS45\webroot\ajtest\ntu-ocw\application\models\mcou.php(112): show_error('Error in query ...') #2 E:\FMS45\webroot\ajtest\ntu-ocw\application\models\mcou.php(146): MCou->queryByPage('select * from o...', 1, 10) #3 E:\FMS45\webroot\ajtest\ntu-ocw\application\controllers\ocw.php(234): MCou->search('';', 1, 10) #4 [internal function]: Ocw->search() #5 C:\CodeIgniter-2.1.0-system\core\CodeIgniter.php(359): call_user_func_array(Array, Array) #6 E:\FMS45\webroot\ajtest\ntu-ocw\index.php(202): require_once('C:\CodeIgniter-...') #7 {main}