仅PHP5(仅用PHP5.0测试)。
如果出于某种原因,您更喜欢异常而不是错误,并且让您的自定义错误处理程序(set_error_handler)将错误包装为异常,那么您必须小心使用脚本。
因为如果您不只是调用异常处理程序,而是抛出异常,并且有一个自定义异常处理程序(set_exception_handler)。当异常处理程序内部触发错误时,您将得到一个奇怪的错误:
“致命错误:在第0行的未知中引发了没有堆栈帧的异常”
这个错误没有特别的信息,是吗?:)
下面的示例将导致此错误。
<?php(电话)
班PHP错误异常延伸例外情况
{
私有的$上下文=无效的;
公共职能__构造
($代码,$条消息,$文件,$行,$上下文=无效的)
{
起源::__构造($消息,$代码);
$这个->文件=$文件;
$这个->线=$行;
$这个->上下文=$上下文;
}
};
功能错误处理程序($代码,$消息,$文件,$行) {
抛出新的PHP错误异常($代码,$消息,$文件,$行);
}
功能异常处理程序(例外$e)
{
$个错误=数组(
用户错误=>“用户错误”,
用户警告(_U)=>“用户警告”,
_用户_通知=>“用户通知”,
);
回声$个错误[美元->获取代码()]。': '.美元->获取消息().“在”.美元->获取文件().
'在线'.美元->获取线路().“\n”;
回声美元->获取跟踪AsString();
}
设置错误处理程序('错误处理程序');
设置异常处理程序('异常处理程序');
抛出新的例外(“foo”,0);
?>
然而,有一个简单的修复方法,因为它的唯一原因是代码太草率。
与之类似,直接从error_handler调用exception_handlers,而不是抛出异常。它不仅解决了这个问题,而且速度更快。虽然这将导致打印“常规”未处理的异常,并且如果只打算显示“设计的”错误消息,这并不是最终的解决方案。
那么,该怎么办呢?确保exception_handlers中的代码不会导致任何错误!在这种情况下,一个简单的isset()就可以解决这个问题。
尊敬的C-A B。