当前位置:Gxlcms > PHP教程 > php的异常和处理

php的异常和处理

时间:2021-07-01 10:21:17 帮助过:14人阅读

常见错误处理类型

  • 语法错误

  • 环境错误

  • 逻辑错误

常见错误级别

  • Deprecated 最低级别的错误

    • 不推荐,不建议,使用一些过期函数的时候会出现,程序继续执行

  • Notice 通知级别的错误

    • 使用一些未定义变量、常量或者数组key没有加引号的时候会出现,程序继续执行

  • Waning 警告级别的错误

    • 程序出问题了,需要修改代码!!!程序继续执行

  • Fatal Error 错误级别的错误

    • 程序直接报错,需要修改代码!!!中断程序执行

  • parse error 语法解析错误

    • 语法检查阶段报错,需要修改代码!!!中断程序执行

  • E_USER_相关的错误

    • 用户定义的错误,用户手动抛出错误,进行自定义错误处理

PHP配置文件和错误相关选项

设置错误级别
1、通过修改php.ini文件设置错误级别,静态设置,需要重启apache
// error_reporting = E_ALL&~E_NOTICE; //显示所有错误,除了E_NOTICE级别
// display_errors = 1; //线下开启,先上关闭

2、通过error_reporting()函数设置,动态设置
// error_reporting(E_ALL&~E_NOTICE); //显示所有错误,除了E_NOTICE级别
// error_reporting(0); //屏蔽所有错误,只会显示语法解析错误
// erorr_reporting(-1); //显示所有错误

3、通过ini_set()函数进行运行时设置,动态设置
// ini_set('error_reporting',0);
// ini_set('error_reporting',-1);
// ini_set('display_errors',0);

使用triggerr_error进行错误抛出

代码继续执行';

记录错误

配置php.ini脚本设置记录错误
log_errors = On //是否将产生错误信息记录到日志或者error_log中
;error_log = syslog //设置脚本错误将记录到系统日志中
log_errors_max_len = 1024 //设置错误报错最大值,单位字节
ignore_repeated_errors = Off //是否忽略重复的错误信息
ignore_repeated_source = Off //是否忽略重复错误消息的来源
track_errors = On //如果开启,最后一个错误将永远保存在$php_errormsg中

将错误记录到指定的文件中

输出error_reporting(-1);echo $test; //NOTICEecho '
';settype($var,'king'); //Warningecho '
';test(); //Fatal error

将日志文件保存到系统日志中

   

将错误以邮件形式发送
1、首先需要配置邮件服务器!
2、去php.ini中配置邮件参数
3、写代码

error_log('当前系统被人攻击!产生错误!',1,'87399497@qq.com');

error_log函数使用

error_log($msg); //传入错误记录,需要与error_log配置使用

如何使用Set_error_handler()

错误代码:[{$errno}] {$errmsg} 
".PHP_EOL; echo "错误行号:{$file}文件中的第 {$line}
".PHP_EOL; echo "PHP版本:".PHP_VERSION."(".PHP_OS.")
".PHP_EOL; //注意:如果自定义错误处理捕获了,代码还是会执行,如果不想被执行,需要die掉!!! //die;}//设置自定义错误处理set_error_handler('customer_error');//
输出一个未定义变量的警告echo $test;echo '
';//原生出错//Notice: Undefined variable: test in D:\phpStudy\WWW\example\index.php on line 26//自定义出错//错误代码:[8] Undefined variable: test //错误行号:D:\phpStudy\WWW\example\index.php文件中的第 26 //PHP版本:5.3.29(WINNT) //无法捕获一个致命错误Fatal error,会切换到原生出错//test();//手动抛出一个错误,被自定义的错误处理捕获trigger_error('this is a test of error',E_USER_ERROR);echo 'contiune';echo '
';//错误代码:[256] this is a test of error //错误行号:D:\phpStudy\WWW\example\index.php文件中的第 43 //PHP版本:5.3.29(WINNT) //contiune//取消自定义错误处理,将会重新适应PHP原生的错误处理restore_error_handler();echo $tt;echo '
';//Notice: Undefined variable: tt in D:\phpStudy\WWW\example\index.php on line 49//重新挂载自定义错误处理//除了NOTICE级别的交给系统处理,剩下的全部使用customer_error自定义的错误处理set_error_handler('customer_error',E_ALL&~E_NOTICE);echo $asc; //E_NOTICE级别,系统的错误处理settype($var,'king'); //E_WARNING级别,使用自定义的错误处理//Notice: Undefined variable: asc in D:\phpStudy\WWW\example\index.php on line 65//错误代码:[2] settype() [function.settype]: Invalid type //错误行号:D:\phpStudy\WWW\example\index.php文件中的第 66 //PHP版本:5.3.29(WINNT)

自定义一个错误处理器

msg = $msg;        $this->filename = $filename;        $this->line = $line;        $this->vars = $vars;    }    public static function deal($errno,$errmsg,$filename,$line,$vars){                $self = new self($errmsg,$filename,$line,$vars);        switch ($errno) {            case E_USER_ERROR :                return $self->dealError();                break;            case E_USER_WARNING :            case E_WARNING :                return $self->dealWarning();                break;            case E_NOTICE :            case E_USER_NOTICE :                return $self->dealNotice();                break;            default:                return false;                break;        }    }    /**     * 处理致命错误     * @return [type] [description]     */    public function dealError(){        ob_start();        debug_print_backtrace();        $backtrace = ob_get_flush();        $errmsg = <<filename}产生错误的信息:{$this->msg}产生错误的行号:{$this->line}追踪信息:{$backtrace}EOF;        //发送邮件的错误日志        //error_log($errmsg,1,'87399497@qq.com');        //记录到错误日志        error_log($errmsg,3,'D:/logs/customer_error.log');        exit(1);    }    /**     * 处理警告错误     * @return [type] [description]     */    public function dealWarning(){        $errmsg = <<filename}产生警告的信息:{$this->msg}产生警告的行号:{$this->line}EOF;        error_log($errmsg,3,'D:/logs/customer_warning.log');    }    /**     * 处理通知级别的错误     * @return [type] [description]     */    public function dealNotice(){        $date = date('Y-m-d H:i:s',time());        $errmsg = <<filename}产生错误的信息:{$this->msg}产生错误的行号:{$this->line}产生通知的时间:{$date}EOF;        error_log($errmsg,3,'D:/logs/customer_notice.log');    }}//显示所有错误error_reporting(-1);//设置自定义错误,使用传入类和方法的方式set_error_handler(array('MyErrorHandler','deal'));//触发NOTICE级别错误,会保存到log日志中echo $tt;//手动触发一个错误trigger_error('手动抛出一个错误',E_USER_ERROR);

register_shutdown_function()函数

';            error_get_last();            echo '
'; //因为register_shutdown_function调用该函数的时候,是代码终止,脱离当前PHP上下文环境了 //所以$filename的路径要写决定路径!!! file_put_contents('D:\logs\register_shutdown_function.log', error_get_last()); die('endScript'); } }}//特别声明!如果有die或exit在注册错误处理之前,那么将不会注册错误处理register_shutdown_function(array('Showdown','endScript'));echo md6();

错误抑制符

@settype($var,'longjq'); //无变量$var,使用@符号进行抑制错误
输出

错误级别

http://www.w3school.com.cn/php/php_ref_error.asp

人气教程排行