提问人:RobertPitt 提问时间:9/25/2010 最后编辑:RobertPitt 更新时间:9/25/2010 访问量:638
在我的框架中实现错误处理
Implement Error Handling to my framework
问:
我即将开始在我的框架中实现错误处理,并寻找一些关于如何构建它的建议。
首先,让我解释一下我的框架目前是如何构建的:
我将框架启动与应用程序启动分开,因此在应用程序启动中引起的任何错误都应该由专门用于该操作的类专门处理。
我的想法是让一个名为 witch 的类将错误报告设置为因为我的框架对 PHP 5.3 的错误严格,然后作为我的应用程序负载,我将运行该类中的关闭函数函数以恢复所有更改的默认值。Core_Error_exception
E_ALL
我要做的是捕获所有错误,然后在应用程序启动之前,我告诉类停止捕获错误,因为会注意错误。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('test',XXX);我希望能够跟踪所有错误,直到应用程序启动或触发E_USER_ERROR。
有时我很难完全掌握PHP的错误系统,等等,因为有时我会对如何构建它以防摔感到困惑。
答:
我不太确定你在做什么,但最直接的方法是使用嵌套的 try 块,沿着
in Class Application:
function run() {
try {
--do stuff
} catch(AppException $e) {
-- handle application-level exception
}
-- all other exceptions fall through
in Class Core:
try {
$core->init();
$application->run(); <-- calls the above function
$core->done();
} catch(Exception $e) {
--last chance exception handler
--process exceptions the Application was unable to handle on its own
}
为了能够以这种方式捕获 php 内置错误或事件,您还应该始终安装一个错误到异常处理程序。trigger_error
评论
trigger_error
你所拥有的看起来很扎实。您必须添加一些逻辑,以便在引发关闭脚本的错误时,刷新 ob 缓冲区中的输出,并将所有收集的数据发送到错误 HTML 文件以显示跟踪。像这样:
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)
);
if($errno == E_USER_ERROR) {
ob_clean();
// Pass collected data to HTML template
// Display HTML
exit();
}
var_dump($this->stack_trace);
}
我不是 100% 确定您可以从致命错误中优雅地恢复,但从您所说的内容来看,您只是在寻找特定的非致命错误来关闭处理。
另外,您捕获缓冲内容的意图是什么?如果您要查找的错误从未被击中,我会假设它要么显示,要么被抛出并显示错误屏幕(为什么我在错误函数中添加了ob_clean)?
评论
下一个:生成一个随机数,但有一个转折
评论