您当前的位置: 首页 > 网站编程 > PHP教程 > 分析动态网页技术PHP中错误处理的一些方法

分析动态网页技术PHP中错误处理的一些方法

作者:不详 来源:网络 发布时间: 2010-04-22 21:32 点击:
已经玩php一段时间了,基本是from0开始的,经常出现的问题也很多,慢慢的可以熟练的查询文档了,而且,经验也不是很多。 先lookhere。: error_reporting(1048);//1,2,4,7,...,1048 ob_start(); session_start(); date_default_timezone_set('Asia/Shanghai'); ph

分析动态网页技术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就是这么做的.

分享到:
本文"分析动态网页技术PHP中错误处理的一些方法"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4