我即將開始在我的框架中實現錯誤處理並尋找關於如何構建它的一些建議。對我的框架實現錯誤處理
首先讓我解釋一下我的框架,目前是如何建立起來的:
林分離應用程序啓動框架的啓動,所以導致應用程序啓動中的任何錯誤都應該由專門的那類專門處理。
我的想法是有一個叫Core_Error_exception
女巫類將設置錯誤E_ALL
報告作爲我的框架將是嚴格的誤差爲PHP 5.3,然後根據我的我的應用程序負載我將運行中的關機功能功能該類恢復所有默認值已更改。
什麼即時希望做的是捕捉那些E_*_NOTICE
而不是E_*_ERROR
,然後應用程序啓動時我告訴類停止捕獲錯誤爲Application_Error_Exception
前會看出來的錯誤的所有錯誤。
所以我需要一種方法來跟蹤包括異常和觸發器在內的所有錯誤,然後在應用程序初始化之前顯示一個框架調試頁面。
那種類我一直在尋找的是,像這樣:
class Core_Error_Exception
{
var $previus_error_level,$captured_contents;
private $stack_trace = array();
public function Core_Error_Exception()
{
$this->previus_error_level = error_reporting(-1);
set_error_handler(array($this,'_collect_error'));
set_exception_handler(array($this,'_collect_error'));
ob_start(array($this,'_capture'));
}
public function _collect_error($errno, $errstr, $errfile, $errline, $context)
{
$this->stack_trace[] = array(
array('name' => 'Error ID:', 'value' => $errno),
array('name' => 'Error String:','value' => $errstr),
array('name' => 'Error File:', 'value' => $errfile),
array('name' => 'Error Line:', 'value' => $errline),
array('name' => 'Context PRE:', 'value' => $context)
);
var_dump($this->stack_trace);
}
/*
* _capture is used to capture pre_bufferd content.
*/
public function _capture($content,$bitfeild)
{
if($bitfeild & PHP_OUTPUT_HANDLER_START)
{
$this->captured_contents = $content;
}
if($bitfeild & PHP_OUTPUT_HANDLER_CONT)
{
$this->captured_contents .= $content;
}
if($bitfeild & PHP_OUTPUT_HANDLER_END)
{
$this->captured_contents .= $content;
}
return false;
}
}
那麼什麼即時希望做的是要能夠構建一個秋天,防爆方式這一類,以便任何通知的錯誤可能已被觸發的數據將被放入數組中,如果調用了E_ERROR通知,則會自動在該點執行關閉操作,以防止導致更多錯誤。
我將使用一個小的html模板處理程序,我可以將這些錯誤傳遞到上下文中,因此注意錯誤和單個E_*_ERROR
(如果適用)。
什麼是過去構建這個類的最好方法我在做錯誤跟蹤/報告時遇到了一些困難。
更新:與當前類
如果錯誤觸發的諸如trigger_error( '測試',XXX);我希望能夠跟蹤所有錯誤,直到應用程序啓動或E_USER_ERROR被觸發。
有時候我很難完全掌握PHP的錯誤系統,等等,因爲有時候我會爲如何構建它而感到困惑,所以它的防摔能力。
豎起大拇指,這是最可靠的方式來做到這一點。 – 2010-09-25 10:11:44
但這隻適用於瞭解異常的人,很多用戶不會這麼做,所以我也跟蹤可能未捕獲的錯誤,甚至觸發'trigger_error' – RobertPitt 2010-09-25 10:19:44
@Robert,好點,請參閱更新。 – user187291 2010-09-25 10:36:24