设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-07-07 13:03 所属栏目:121 来源:互联网
导读:已经玩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就是这么做的.

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读