參考連結
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.');錯誤訊息現在變成像下面這樣了,在程式開發時能夠更方便的除錯。但千萬記住,在正式的網站上,將這訊息拿掉。
Error in query preparation/execution.#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}