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
An Error Was Encountered
Error in query preparation/execution.
Call Trace
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}