浅析动态网页技术PHP中错误处理的一些方法
发布时间:2022-07-07 13:36:28 所属栏目:PHP教程 来源:互联网
导读:已经玩php一段时间了,基本是from 0开始的,经常出现的问题也很多,慢慢的可以熟练的查询文档了,而且,经验也不是很多。 先look here。: error_reporting(1048);//1,2,4,7,...,1048 ob_start(); session_start(); date_default_timezone_set(Asia/Sha
已经玩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("以下描述类".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的处理方式 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 .= ('<hr/>致命错误'); } echo('<pre>'); echo(str); echo('</pre>'); } } 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()."/n"; 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 .= ('<hr/>致命错误'); } echo('<pre>'); echo(str); echo('</pre>'); } } 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 '我肯定是错误' 学习动态网页技术PHP中错误处理的一些方法 另外,在类中,还可以这样: function trigger_error(error_msg, error_type = E_USER_WARNING) { trigger_error(" error: error_msg", error_type); } 著名的Smarty就是这么做的. (编辑:海洋资讯信息网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐