«
PHP中错误处理的一些方法

时间:2008-5-31    作者:Deri    分类: 分享


   <p>  已经玩php一段时间了,基本是from0开始的,经常出现的问题也很多,慢慢的可以熟练的查询文档了,而且,经验也不是很多。</p><p>  先lookhere。:</p><p><code>error_reporting(1048);//1,2,4,7,...,1048<br />ob_start();<br />session_start();<br />date_default_timezone_set('Asia/Shanghai');</code></p><p>  php的递给调用会吃掉很多的内存。</p><p>  一般的,不要太多的使用define。</p><p>  在类的构造和属性器方面,5已经做了很多的工作,克服的bug就不说了,__系列的函数都有一些看点,也是支持static的。</p><p>  按照我现在的写过的程序,很少用到框架页面的,我感觉在php里面速度不在是一个问题。</p><p>  注意类的调用次序,特别是已经extends的,准确的释放掉内存。</p><p>  @mysql_fetch_array($result,MYSQL_ASSOC);</p><p>  这个注意使用乱用,MYSQL_ASSOC,MYSQL_NUM和MYSQL_BOTH是一个enum吧。默认的是MYSQL_BOTH.</p><p>  mysql的语句,如果执行in的话不再支持limit。so...很麻烦。</p><p>  支持distinct,group之,程序循环执行,md。</p><p>   <p><code>if(get_magic_quotes_gpc()){<br />  $_GET=    stripslashes_gpc($_GET);<br />  $_POST=  stripslashes_gpc($_POST);<br />  $_COOKIE=  stripslashes_gpc($_COOKIE);<br />}<br />  set_magic_quotes_runtime(0);#magic_quotes_runtime<br />functionstripslashes_gpc($array){<br />  while(list($key,$value)=each($array)){<br />    if(is_string($value)){<br />      $array[$key]=addslashes(stripslashes($value));<br />    }elseif(is_array($value)) {<br />      $array[$key]=stripslashes_gpc($value);<br />    }<br />  }<br />  return$array;<br />}<br />/**<br />*处理程序中出现的错误<br />*@Date:2006-10-9-10:51<br />*@param  (类型)  (参数名)  (描述)<br />*/<br />functionError_Handler($errno,$errstr,$errorfile,$errline,$errtext){<br />  echo('系统发生错误:'.$errstr);<br />  echo('At'.$errorfile.'的第'.$errline.'行.');<br />  if($errno==E_USER_ERROR){<br />    echo('致命错误,程序已经中止');<br />  }<br />}</code></p>
<p> </p>

   <p>  在使用的时候: <p><code>set_error_handler('Error_Handler');<br />trigger_error('calltrigger_error',E_USER_ERROR);</code></p><p>  这是使用函数获取的,当然您的错误报告级别应该高点:</p><p>  error_reporting(1048);</p><p>  为了更加oo,先看看一个描述类的自写的函数:</p><p><code>$classname='Exception';<br />/**<br />*(功能描述)<br />*@Date:<br />*@param  (类型)  (参数名)  (描述)<br />*/<br />functionClassDetail($classname){<br />  if(!class_exists($classname)){<br />    echo($classname.'类不存在');<br />  }else{<br />    print_r("以下描述类".$classname);<br />    print_r("所有的方法<pre>");<br />    print_r(get_class_methods($classname));<br />    print_r("</pre>");<br />    print_r("<hr/>所有的属性<pre>");<br />    print_r(get_class_vars($classname));<br />    print_r("</pre><hr/>");<br />  }<br />}<br />ClassDetail($classname);</code></p><p>  发现exception类的所有get方法是:</p><p><code>  [0]=>__construct<br />  [1]=>getMessage<br />  [2]=>getCode<br />  [3]=>getFile<br />  [4]=>getLine<br />  [5]=>getTrace<br />  [6]=>getTraceAsString<br />  [7]=>__toString</code></p><p>  慢慢的优化个性点,也可以的。</p><p>  ok,来看比较oo的处理方式:</p><p><code>classErrorHandlersextendsException{<br />  private$_context=null;<br />  function __construct($level, $string, $file, $line, $context=null){ <br />    parent::__construct($string,$level); <br />    $this->file = $file;  <br />    $this->line = $line; <br />    $this->_level = $level; <br />    $this->_context = $context;<br />  }<br />  function__destruct(){<br />//    parent::__destruct();<br />  }<br />  functionMessage(){<br />     $errors=array(<br />           E_ERROR     =>'error',<br />           E_WARNING    =>'warning',<br />           E_PARSE     =>'parsingerror',<br />           E_NOTICE     =>'notice',<br />           E_CORE_ERROR   =>'coreerror',<br />           E_CORE_WARNING  =>'corewarning',<br />           E_COMPILE_ERROR =>'compileerror',<br />           E_COMPILE_WARNING=>'compilewarning',<br />           E_USER_ERROR   =>'usererror',<br />           E_USER_WARNING  =>'userwarning',<br />           E_USER_NOTICE  =>'usernotice'<br />          );<br />    $str=$errors[parent::getCode()].':'.parent::getMessage().'在'.parent::getFile().<br />   '的第'.parent::getLine()."行<br />";<br />    if($this->_level==E_USER_ERROR){<br />        $str.=('<hr/>致命错误');<br />      }<br />    echo('<pre>');<br />    echo($str);<br />    echo('</pre>');<br />  }<br />}<br />functionerror_handler($errno,$errstr,$errorfile,$errline,$errtext){<br />  thrownewErrorHandlers($errno,$errstr,$errorfile,$errline,$errtext);<br />}<br />functionexception_handler(Exception$e)<br />{  <br /> $errors=array(<br /> E_ERROR     =>'error',<br /> E_WARNING    =>'warning',<br /> E_PARSE     =>'parsingerror',<br /> E_NOTICE     =>'notice',<br /> E_CORE_ERROR   =>'coreerror',<br /> E_CORE_WARNING  =>'corewarning',<br /> E_COMPILE_ERROR =>'compileerror',<br /> E_COMPILE_WARNING=>'compilewarning',<br /> E_USER_ERROR   =>'usererror',<br /> E_USER_WARNING  =>'userwarning',<br /> E_USER_NOTICE  =>'usernotice');<br />   <br /> echo$errors[$e->getCode()].':'.$e->getMessage().'in'.$e->getFile().<br />   'online'.$e->getLine()."<br />";<br /> echo$e->getTraceAsString();<br />}<br />trigger_error('5do8');<br />try{ <br />  $i =1/0; <br />}catch(ErrorHandlers $e) { <br />   echo "发生错误.";//可以输出错误行<br />   $e->Message();<br />}</code></p>
 <p> </p>

   <p>  而后,注意了,如果您第一次(或者重新)加载的话,就加上:</p><p><code>set_error_handler('error_handler');<br />set_exception_handler('exception_handler');</code></p><p>  如果不是上述情况,就不要加了,否则会出现</p><p>   <p>  ExceptionthrownwithoutastackframeinUnknownonline0</p><p>  因为error_handler是anto_flush的。</p><p>  在一个exception里面不能调用其他的exception。有2条普遍适用的规则,如下:</p><p>  1:不要在一个Exception里面执行另一个Exception</p><p>  2:不要在析构函数里面执行Exception.</p><p>  restore_exception_handler();是可以保存exception柄的,注意,执行error以后就会有Exception的了。</p><p>  最后,加上一个完整的例子:CallError.php  <p><code><?<br />error_reporting(1048);<br />classErrorHandlersextendsException{<br />  private$_context=null;<br />  function __construct($level, $string, $file, $line, $context=null){ <br />    parent::__construct($string,$level); <br />    $this->file = $file;  <br />    $this->line = $line; <br />    $this->_level = $level; <br />    $this->_context = $context;<br />  }<br />  function__destruct(){<br />//    parent::__destruct();<br />  }<br />  functionMessage(){<br />     $errors=array(<br />           E_ERROR     =>'error',<br />           E_WARNING    =>'warning',<br />           E_PARSE     =>'parsingerror',<br />           E_NOTICE     =>'notice',<br />           E_CORE_ERROR   =>'coreerror',<br />           E_CORE_WARNING  =>'corewarning',<br />           E_COMPILE_ERROR =>'compileerror',<br />           E_COMPILE_WARNING=>'compilewarning',<br />           E_USER_ERROR   =>'usererror',<br />           E_USER_WARNING  =>'userwarning',<br />           E_USER_NOTICE  =>'usernotice'<br />          );<br />    $str=$errors[parent::getCode()].':'.parent::getMessage().'在'.parent::getFile().<br />   '的第'.parent::getLine()."行<br />";<br />    if($this->_level==E_USER_ERROR){<br />        $str.=('<hr/>致命错误');<br />      }<br />    echo('<pre>');<br />    echo($str);<br />    echo('</pre>');<br />  }<br />}<br />functionerror_handler($errno,$errstr,$errorfile,$errline,$errtext){<br />  thrownewErrorHandlers($errno,$errstr,$errorfile,$errline,$errtext);<br />}<br />functionexception_handler(Exception$e)<br />{  <br /> $errors=array(<br /> E_ERROR     =>'error',<br /> E_WARNING    =>'warning',<br /> E_PARSE     =>'parsingerror',<br /> E_NOTICE     =>'notice',<br /> E_CORE_ERROR   =>'coreerror',<br /> E_CORE_WARNING  =>'corewarning',<br /> E_COMPILE_ERROR =>'compileerror',<br /> E_COMPILE_WARNING=>'compilewarning',<br /> E_USER_ERROR   =>'usererror',<br /> E_USER_WARNING  =>'userwarning',<br /> E_USER_NOTICE  =>'usernotice');<br />   <br /> echo$errors[$e->getCode()].':'.$e->getMessage().'在'.$e->getFile().<br />   '的第'.$e->getLine()."行<br />";<br /> echo$e->getMessage();<br /> die();<br />}<br />//<br />set_error_handler('error_handler');<br />//restore_error_handler();<br />set_exception_handler('exception_handler');<br />//restore_exception_handler();<br />我肯定是错误<br />?></code></p></p><p>  执行结果:</p><p>  notice:Useofundefinedconstant我肯定是错误-assumed'我肯定是错误'在E:webwebphpiexceptionm.php的第74行Useofundefinedconstant我肯定是错误-assumed'我肯定是错误'</p><p>  <img src="/content/uploadfile/200805/2008053117222006.gif" onclick="get_larger(this)" alt="PHP中错误处理的一些方法" /></p><p>  另外,在类中,还可以这样:</p><p><code>  functiontrigger_error($error_msg,$error_type=E_USER_WARNING)<br />  {<br />    trigger_error("error:$error_msg",$error_type);<br />  }</code></p><p>  著名的Smarty就是这么做的.</p></p>