网页教学网
 当前位置: 网页教学网 >> 网络编程 >> PHP编程技术 >> 学习动态网页技术PHP中错误处理的一些方法
[ HTML ] [ FW ] [ DW ] [ FP ] [ JS ] [ XML ] [ CSS ] [ 图象 ] [ FLASH ] [ .NET ] [ ASP ] [ JSP ] [ PHP ] [ 数据 ] [ 系统 ] [ 安全 ] [ 素材 ] [ 建站 ] [ 主机 ] [ 入门 ] [ 技巧 ]

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

http://www.webjx.com  更新日期:2007-09-17 08:01  出处:网页教学网  作者:
  已经玩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就是这么做的.

关键词:php
推荐给好友】【关闭】【收藏本文
最新五条评论
查看全部评论
评论总数 0
您的评论
用户名: 新注册) 密 码: 匿名:
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
站内搜索
相关文章
推荐文章