分析动态网页技术PHP中错误处理的一些方法
已经玩php一段时间了,基本是from0开始的,经常出现的问题也很多,慢慢的可以熟练的查询文档了,而且,经验也不是很多。
先lookhere。:
error_reporting(1048);//1,2,4,7,...,1048
ob_start();
session_start();
date_default_timezone_set('Asia/Shanghai');
php的递给调用会吃掉很多的内存。
一般的,不要太多的使用define。
在类的构造和属性器方面,5已经做了很多的工作,克服的bug就不说了,__系列的函数都有一些看点,也是支持static的。
按照我现在的写过的程序,很少用到框架页面的,我感觉在php里面速度不在是一个问题。
注意类的调用次序,特别是已经extends的,准确的释放掉内存。
@mysql_fetch_array(result,MYSQL_ASSOC);
这个注意使用乱用,MYSQL_ASSOC,MYSQL_NUM和MYSQL_BOTH是一个enum吧。默认的是MYSQL_BOTH.
mysql的语句,如果执行in的话不再支持limit。so...很麻烦。
支持distinct,group之,程序循环执行,md。
if(get_magic_quotes_gpc()){
_GET=stripslashes_gpc(_GET);
_POST=stripslashes_gpc(_POST);
_COOKIE=stripslashes_gpc(_COOKIE);
}
set_magic_quotes_runtime(0);#magic_quotes_runtime
functionstripslashes_gpc(array){
while(list(key,value)=each(array)){
if(is_string(value)){
array[key]=addslashes(stripslashes(value));
}elseif(is_array(value)){
array[key]=stripslashes_gpc(value);
}
}
returnarray;
}
/**
*处理程序中出现的错误
*@Date:2006-10-9-10:51
*@param(类型)(参数名)(描述)
*/
functionError_Handler(errno,errstr,errorfile,errline,errtext){
echo('系统发生错误:'.errstr);
echo('At'.errorfile.'的第'.errline.'行.');
if(errno==E_USER_ERROR){
echo('致命错误,程序已经中止');
}
}
在使用的时候:
set_error_handler('Error_Handler');
trigger_error('calltrigger_error',E_USER_ERROR);
这是使用函数获取的,当然您的错误报告级别应该高点:
error_reporting(1048);
为了更加oo,先看看一个描述类的自写的函数:
classname='Exception';
/**
*(功能描述)
*@Date:
*@param(类型)(参数名)(描述)
*/
functionClassDetail(classname){
if(!class_exists(classname)){
echo(classname.'类不存在');
}else{
print_r("以下描述类".classname);
print_r("所有的方法<pre>");
print_r(get_class_methods(classname));
print_r("</pre>");
print_r("<hr/>所有的属性<pre>");
print_r(get_class_vars(classname));
print_r("</pre><hr/>");
}
}
ClassDetail(classname);
发现exception类的所有get方法是:
[0]=>__construct
[1]=>getMessage
[2]=>getCode
[3]=>getFile
[4]=>getLine
[5]=>getTrace
[6]=>getTraceAsString
[7]=>__toString
慢慢的优化个性点,也可以的。
ok,来看比较oo的处理方式:
classErrorHandlersextendsException{
private_context=null;
function__construct(level,string,file,line,context=null){
parent::__construct(string,level);
this->file=file;
this->line=line;
this->_level=level;
this->_context=context;
}
function__destruct(){
//parent::__destruct();
}
functionMessage(){
errors=array(
E_ERROR=>'error',
E_WARNING=>'warning',
E_PARSE=>'parsingerror',
E_NOTICE=>'notice',
E_CORE_ERROR=>'coreerror',
E_CORE_WARNING=>'corewarning',
E_COMPILE_ERROR=>'compileerror',
E_COMPILE_WARNING=>'compilewarning',
E_USER_ERROR=>'usererror',
E_USER_WARNING=>'userwarning',
E_USER_NOTICE=>'usernotice'
);
str=errors[parent::getCode()].':'.parent::getMessage().'在'.parent::getFile().
'的第'.parent::getLine()."行\n";
if(this->_level==E_USER_ERROR){
str.=('<hr/>致命错误');
}
echo('<pre>');
echo(str);
echo('</pre>');
}
}
functionerror_handler(errno,errstr,errorfile,errline,errtext){
thrownewErrorHandlers(errno,errstr,errorfile,errline,errtext);
}
functionexception_handler(Exceptione)
{
errors=array(
E_ERROR=>'error',
E_WARNING=>'warning',
E_PARSE=>'parsingerror',
E_NOTICE=>'notice',
E_CORE_ERROR=>'coreerror',
E_CORE_WARNING=>'corewarning',
E_COMPILE_ERROR=>'compileerror',
E_COMPILE_WARNING=>'compilewarning',
E_USER_ERROR=>'usererror',
E_USER_WARNING=>'userwarning',
E_USER_NOTICE=>'usernotice');
echoerrors[e->getCode()].':'.e->getMessage().'in'.e->getFile().
'online'.e->getLine()."\n";
echoe->getTraceAsString();
}
trigger_error('5do8');
try{
i=1/0;
}catch(ErrorHandlerse){
echo"发生错误.";//可以输出错误行
e->Message();
}
而后,注意了,如果您第一次(或者重新)加载的话,就加上:
set_error_handler('error_handler');
set_exception_handler('exception_handler');
如果不是上述情况,就不要加了,否则会出现
ExceptionthrownwithoutastackframeinUnknownonline0
因为error_handler是anto_flush的。
在一个exception里面不能调用其他的exception。有2条普遍适用的规则,如下:
1:不要在一个Exception里面执行另一个Exception
2:不要在析构函数里面执行Exception.
restore_exception_handler();是可以保存exception柄的,注意,执行error以后就会有Exception的了。
最后,加上一个完整的例子:CallError.php
<?
error_reporting(1048);
classErrorHandlersextendsException{
private_context=null;
function__construct(level,string,file,line,context=null){
parent::__construct(string,level);
this->file=file;
this->line=line;
this->_level=level;
this->_context=context;
}
function__destruct(){
//parent::__destruct();
}
functionMessage(){
errors=array(
E_ERROR=>'error',
E_WARNING=>'warning',
E_PARSE=>'parsingerror',
E_NOTICE=>'notice',
E_CORE_ERROR=>'coreerror',
E_CORE_WARNING=>'corewarning',
E_COMPILE_ERROR=>'compileerror',
E_COMPILE_WARNING=>'compilewarning',
E_USER_ERROR=>'usererror',
E_USER_WARNING=>'userwarning',
E_USER_NOTICE=>'usernotice'
);
str=errors[parent::getCode()].':'.parent::getMessage().'在'.parent::getFile().
'的第'.parent::getLine()."行\n";
if(this->_level==E_USER_ERROR){
str.=('<hr/>致命错误');
}
echo('<pre>');
echo(str);
echo('</pre>');
}
}
functionerror_handler(errno,errstr,errorfile,errline,errtext){
thrownewErrorHandlers(errno,errstr,errorfile,errline,errtext);
}
functionexception_handler(Exceptione)
{
errors=array(
E_ERROR=>'error',
E_WARNING=>'warning',
E_PARSE=>'parsingerror',
E_NOTICE=>'notice',
E_CORE_ERROR=>'coreerror',
E_CORE_WARNING=>'corewarning',
E_COMPILE_ERROR=>'compileerror',
E_COMPILE_WARNING=>'compilewarning',
E_USER_ERROR=>'usererror',
E_USER_WARNING=>'userwarning',
E_USER_NOTICE=>'usernotice');
echoerrors[e->getCode()].':'.e->getMessage().'在'.e->getFile().
'的第'.e->getLine()."行\n";
echoe->getMessage();
die();
}
//
set_error_handler('error_handler');
//restore_error_handler();
set_exception_handler('exception_handler');
//restore_exception_handler();
我肯定是错误
?>
执行结果:
notice:Useofundefinedconstant我肯定是错误-assumed'我肯定是错误'在E:\web\web\php\bi\exception\m.php的第74行Useofundefinedconstant我肯定是错误-assumed'我肯定是错误'
另外,在类中,还可以这样:
functiontrigger_error(error_msg,error_type=E_USER_WARNING)
{
trigger_error("error:error_msg",error_type);
}
著名的Smarty就是这么做的.