转自:微点阅读 https://www.weidianyuedu.com/content/0217808912952.html
学习动态网页技术PHP中错误处理的一些方法
已经玩php一段时间了,基本是from 0开始的,经常出现的问题也很多,慢慢的可以熟练的查询文档了,而且,经验也不是很多。
先look here。:
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 function stripslashes_gpc(array) { while (list(key,value) = each(array)) { if (is_string(value)) {
array[key] = addslashes(stripslashes(value)); } else if (is_array(value)) { array[key] = stripslashes_gpc(value);
} }
return array; } /**
* 处理程序中出现的错误 * @Date:2006-10-9-10:51 * @param (类型) (参数名) (描述) */
function Error_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("call trigger_error",E_USER_ERRoR);
这是使用函数获取的,当然您的错误报告级别应该高点:
error_reporting(1048);
为了更加oo,先看看一个描述类的自写的函数:
classname="Exception"; /**
* (功能描述) * @Date:
* @param (类型) (参数名) (描述) */
function classDetail(classname){ if(!class_exists(classname)){ echo(classname."类不存在"); }else{
print_r(\以下描述类\print_r(\所有的方法
\
print_r(get_class_methods(classname)); print_r(\
print_r(\所有的属性
\print_r(get_class_vars(classname)); print_r(\} }
classDetail(classname);
发现exception类的所有get方法是:
[0] => __construct [1] => getMessage [2] => getcode [3] => getFile [4] => getLine [5] => getTrace [6] => getTraceAsString [7] => __toString
慢慢的优化个性点,也可以的。
ok,来看比较oo的处理方式:
class ErrorHandlers extends Exception{ 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(); }
function Message(){
errors = array( E_ERRoR => "error", E_WARnInG => "warning", E_PARSE => "parsing error", E_noTIcE => "notice", E_coRE_ERRoR => "core error", E_coRE_WARnInG => "core warning", E_coMPILE_ERRoR => "compile error", E_coMPILE_WARnInG => "compile warning", E_USER_ERRoR => "user error", E_USER_WARnInG => "user warning", E_USER_noTIcE => "user notice" );
str = errors[parent::getcode()].": ".parent::getMessage()." 在 ".parent::getFile(). " 的第 ".parent::getLine().\行\\n\
if(this->_level==E_USER_ERRoR){ str .= ("
致命错误"); }
echo("
"); echo(str); echo("
"); } }
function error_handler(errno,errstr,errorfile,errline,errtext){ throw new ErrorHandlers(errno,errstr,errorfile,errline,errtext); }
function exception_handler(Exception e) {
errors = array( E_ERRoR => "error", E_WARnInG => "warning", E_PARSE => "parsing error", E_noTIcE => "notice", E_coRE_ERRoR => "core error", E_coRE_WARnInG => "core warning", E_coMPILE_ERRoR => "compile error", E_coMPILE_WARnInG => "compile warning", E_USER_ERRoR => "user error", E_USER_WARnInG => "user warning",
E_USER_noTIcE => "user notice");
echo errors[e->getcode()].": ".e->getMessage()." in ".e->getFile(). " on line ".e->getLine().\echo e->getTraceAsString(); }
trigger_error("5do8"); try{ i = 1/0;
} catch(ErrorHandlers e) { echo \发生错误.\可以输出错误行 e->Message(); }
而后,注意了,如果您第一次(或者重新)加载的话,就加上:
set_error_handler("error_handler"); set_exception_handler("exception_handler");
如果不是上述情况,就不要加了,否则会出现
Exception thrown without a stack frame in Unknown on line 0
因为error_handler是anto_flush的。
在一个exception里面不能调用其他的exception。有2条普遍适用的规则,如下:
1:不要在一个Exception里面执行另一个Exception 2:不要在析构函数里面执行Exception.
restore_exception_handler();是可以保存exception柄的,注意,执行error以后就会有Exception的了。
最后,加上一个完整的例子:callError.php
error_reporting(1048);
class ErrorHandlers extends Exception{ 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(); }
function Message(){ errors = array( E_ERRoR => "error", E_WARnInG => "warning", E_PARSE => "parsing error", E_noTIcE => "notice", E_coRE_ERRoR => "core error", E_coRE_WARnInG => "core warning", E_coMPILE_ERRoR => "compile error", E_coMPILE_WARnInG => "compile warning", E_USER_ERRoR => "user error", E_USER_WARnInG => "user warning", E_USER_noTIcE => "user notice" );
str = errors[parent::getcode()].": ".parent::getMessage()." 在 ".parent::getFile(). " 的第 ".parent::getLine().\行\\n\
if(this->_level==E_USER_ERRoR){ str .= ("
致命错误"); }
echo("
"); echo(str); echo("
"); } }
function error_handler(errno,errstr,errorfile,errline,errtext){ throw new ErrorHandlers(errno,errstr,errorfile,errline,errtext);
}
function exception_handler(Exception e) {
errors = array( E_ERRoR => "error", E_WARnInG => "warning", E_PARSE => "parsing error", E_noTIcE => "notice", E_coRE_ERRoR => "core error", E_coRE_WARnInG => "core warning", E_coMPILE_ERRoR => "compile error", E_coMPILE_WARnInG => "compile warning", E_USER_ERRoR => "user error", E_USER_WARnInG => "user warning", E_USER_noTIcE => "user notice");
echo errors[e->getcode()].": ".e->getMessage()."在".e->getFile(). "的第".e->getLine().\行\\n\echo e->getMessage(); die(); } //
set_error_handler("error_handler"); //restore_error_handler();
set_exception_handler("exception_handler"); //restore_exception_handler();
我肯定是错误 ?>
执行结果:
notice: Use of undefined constant 我肯定是错误 - assumed "我肯定是错误"在E:\\web\\web\\php\\bi\\exception\\m.php的第74行 Use of undefined constant 我肯定是错误 - assumed "我肯定是错误"
另外,在类中,还可以这样:
function trigger_error(error_msg, error_type = E_USER_WARnInG) {
trigger_error(\}