常见错误处理类型

  • 语法错误
  • 环境错误
  • 逻辑错误

常见错误级别

  • 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
header('content-type:text/html;charset=utf-8'); $num1=1;
$num2='xxx';
if ( (!is_numeric($num1) || !is_numeric($num2)) ) { //通知级别,代码继续执行
//echo trigger_error('数值必须为整型!',E_USER_NOTICE); //警告级别,代码继续执行
//echo trigger_error('数值必须为整型!',E_USER_WARNING); //错误级别,代码中断
echo trigger_error('数值必须为整型!',E_USER_ERROR); }else{
echo $num1+$num2;
} echo '<br />代码继续执行';

记录错误

配置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中
将错误记录到指定的文件中

<?php
//运行时设置错误处理
ini_set('display_errors','off');
ini_set('error_log','D:\logs\error.log');
//设置错误输出
error_reporting(-1); echo $test; //NOTICE
echo '<hr />'; settype($var,'king'); //Warning
echo '<hr />'; test(); //Fatal error

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

<?php
error_reporting(-1);
ini_set('display_errors',0);
ini_set('log_errors',1);
ini_set('error_log','syslog');
//该记录方式,在windows中需要去,计算机管理-》事件查看器-》自定义视图中查找php5.4.0的log日志
openlog('PHP5.4.0',LOG_PID,LOG_SYSLOG);
syslog(LOG_ERR,'this is syslog !!!daye:'.date('Y/m/d H:i:s'));
closelog();

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

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

error_log函数使用

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

如何使用Set_error_handler()

<?php

header('content-type:text/html;charset=utf-8');

//-1代表显示所有的错误警告
error_reporting(-1); /**
* 自定义一个错误处理
* @param [type] $errno [错误级别]
* @param [type] $errmsg [错误信息]
* @param [type] $file [错误文件]
* @param [type] $line [错误行号]
* @return [type] [description]
*/
function customer_error($errno,$errmsg,$file,$line){
echo "<b>错误代码:</b>[{$errno}] {$errmsg} <br/>".PHP_EOL;
echo "<b>错误行号:</b>{$file}文件中的第 {$line} <br/>".PHP_EOL;
echo "<b>PHP版本:</b>".PHP_VERSION."(".PHP_OS.") <br/>".PHP_EOL;
//注意:如果自定义错误处理捕获了,代码还是会执行,如果不想被执行,需要die掉!!!
//die;
} //设置自定义错误处理
set_error_handler('customer_error'); //输出一个未定义变量的警告
echo $test;
echo '<hr/>';
//原生出错
//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 '<hr/>'; //错误代码:[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 '<hr />'; //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)

自定义一个错误处理器

<?php

class MyErrorHandler{

    public $msg='';
public $filename='';
public $line=0;
public $vars=array(); public function __construct($msg,$filename,$line,$vars){
$this->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 = <<<EOF
出现了致命错误,如下:
产生错误的文件:{$this->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 = <<<EOF
出现了警告错误,如下:
产生警告的文件:{$this->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 = <<<EOF
出现了通知错误,如下:
产生错误的文件:{$this->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()函数

<?php
//register_shutdown_function该函数将会在PHP执行关闭时调用
//使用场景
//1、页面强制停止
//2、代码意外终止 class Showdown{
public static function endScript(){
if (error_get_last()){
echo '<pre>';
error_get_last();
echo '</pre>'; //因为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://bbs.php-z.com/thread-2528-1-6.html

php的异常和处理的更多相关文章

  1. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  2. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”

    在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...

  3. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  4. 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法

    在使用JSONObject.fromObject的时候,出现“There is a cycle in the hierarchy”异常.   意思是出现了死循环,也就是Model之间有循环包含关系: ...

  5. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 后台创建了一个DntHub的集线器 前台在调用的时候出现了问题(经检查是代理对象 ...

  6. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  7. [C#] C# 知识回顾 - 学会处理异常

    学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...

  8. [C#] C# 知识回顾 - 学会使用异常

    学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...

  9. [C#] C# 知识回顾 - 异常介绍

    异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...

  10. 基于AOP的MVC拦截异常让代码更优美

    与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂 ...

随机推荐

  1. Codeforces 460E Roland and Rose(暴力)

    题目链接:Codeforces 460E Roland and Rose 题目大意:在以原点为圆心,半径为R的局域内选择N个整数点,使得N个点中两两距离的平方和最大. 解题思路:R最大为30.那么事实 ...

  2. linux上安装python3同时保留python2

    linux上安装python3同时保留python2?这个就要用到上篇说到的path变量了. 具体介绍及操作 这里我下载python3.6版本来进行介绍 django默认数据库为sqlite3,所以安 ...

  3. CGI(Common Gateway Interface),通用网关接口

    通用网关接口,简称CGI,是一种根据请求信息动态产生回应内容的技术.通过CGI,Web 服务器可以将根据请求不同启动不同的外部程序,并将请求内容转发给该程序,在程序执行结束后,将执行结果作为回应返回给 ...

  4. Spring MVC文件上传教程

    1- 介绍 这篇教程文章是基于 Spring MVC来实现文件的上传功能,这里主要是实现两个功能:1.上传单个文件并将其移动到对应的上传目录:2.一次上传多个文件并将它们存储在指定文件夹下,接下来我们 ...

  5. java web 开发入门实例

    学习是个技巧活,关键是要找到重点的地方,新手在这方面的坑尤其多.看别人的教程一步一步的跟着做,隔几步就遇到一个新知识点,忍不住就百度往深处了解,一晃半天就过去了. 有的知识点要深入学习的,有的是了解下 ...

  6. 使用nginx cache缓存网站数据实践

    Nginx本身就有缓存功能,能够缓存静态对象,比如图片.CSS.JS等内容直接缓存到本地,下次访问相同对象时,直接从缓存即可,无需访问后端静态服务器以及存储存储服务器,可以替代squid功能. 1   ...

  7. caffe使用自己的数据做分类

    这里只举一个例子: Alexnet网络训练自己数据的过程 用AlexNet跑自己的数据 参考1:http://blog.csdn.net/gybheroin/article/details/54095 ...

  8. PHP 规划(收藏的一些好博文)

    2014-10-15 01:30 36870人阅读 评论(34) 收藏 举报 分类: PHP/DHTML/Other(237) 版权声明:本文为博主原创文章,未经博主允许不得转载. PHP程序员的技术 ...

  9. yii2.0 干货

    Yii2 干货集,欢迎提交 Pull Requests.(提交过来的开源项目最好是你用过的,并且觉得好用的) Docs 文档 Yii Framework 2.0 类参考手册 Yii Framework ...

  10. [Spring MVC]学习笔记--@Controller

    在讲解@Controller之前,先说明一下Spring MVC的官方文档在哪. 可能会有人和我一样,在刚接触Spring MVC时,发现在Spring的网站上找不到Spring MVC这个项目. 这 ...