php错误的处理
错误的分类
通常分3种:
语法错误:
程序运行之前,都要先检查语法。如果语法有错误,就会立即报错,并且不会去执行程序。
运行时错误:
就是在程序语法检查通过后,,开始运行程序并在此过程中遇到的错误。常见的有3中:
提示性错误:
警告性错误:
致命错误:
逻辑错误:
指的是,程序本身可以正常执行,没有报错——但“计算结果”却错了。
错误的分级
php语言中,将各种错误进行了不同级别的分类归纳,并形成大约有10几个级别的错误,这就是技术层面的错误分级。
每一级别的错误,都有一个“代号”,这个代号其实也就是一个系统内部的“常量而已”。比如:
系统常见错误:
E_ERROR: 致命错误
E_WARNING: 警告性错误
E_NOTICE: 提示性错误
用户可自定义的错误:
E_USER_ERROR: 自定义致命错误
E_USER_WARNING: 自定义警告性错误
E_USER_NOTICE: 自定义提示性错误
其他:
E_STRICT: 严谨性语法检查错误
E_ALL 代表“所有错误”。
详细参考手册:
下面来看看这些错误代号的实际值:
运行结果为:
错误的触发
错误的触发,就是让错误“发生”。
有两种方式会触发错误:
系统触发
程序运行到某行代码,确实出现了某种错误,此时系统就会报错——这就是触发了系统错误。
系统触发的典型错误有这3种:
E_NOTICE: 提示性错误:会输出错误提示,并继续执行后续代码;
比如使用不存在的变量或常量:
E_WARNING: 警告性错误:会输出错误提示,并继续执行后续代码(也可能看具体情况,比如require)
比如include载入一个不存在的文件:
E_ERROR: 致命错误:导致程序无法执行后续语句;
比如调用一个不存在的函数!
自定义触发:
当我们处理某些数据的时候,本来数据本身是没有错误的,但根据具体应用(业务)的需要,会要求数据满足某种条件,而该数据并不满足的时候,我们就可以在程序中“主动”去触发(创建)一个错误,以表明该数据的“非法性”。
语法形式:
trigger_error(“错误提示信息内容”, 3中用户错误代号之一);
其中触发了用户的致命错误(E_USER_ERROR),也会终止程序的后续执行。
错误报告的显示问题
所谓错误报告,就是显示在网页上的错误提示内容!
有关错误报告,有2个问题需要处理:
是否显示错误报告(display_errors):
有2种做法可以来设定是否显示:
做法1:
在php.ini文件中,设定display_erros的值,为on(显示),或为off(不显示)
可以修改为:
当然,作为开发阶段,我们都应该显示错误信息。
注意:前提条件都是我们apache已经装载了php.ini文件——这一点,需要在apache的配置文件httpd.config中加入如下一行:
PHPIniDir “php.ini文件的了位置(路径)”
比如:
方法2:
直接在php的脚本文件中设使用函数ini_set()来对其进行设置:
当然,如果设置为1,就是显示!
注意:
1,不管哪种形式,该单词是一样的:display:errors
2,使用php.ini配置,影响的是全局(即所有php网页);
3,在某个脚本代码中使用ini_set()设置,就只影响该脚本代码本身——这是常用的方式。
4,脚本中的设置优先于php.ini中的设置。
显示哪些级别的错误报告(error_reporting):
显然,前提是“display_errors”设置为On(或1),表示可以显示。
显示哪些级别的错误报告,也有2个做法:
做法1:在php.ini文件中;
这个值目前代表“所有错误”,都显示。
修改为:
更多示例为:
error_reporting = E_NOTICE | E_WARING | E_ERROR //显示该3种;
error_reporting = E_ERROR | E_USER_ERROR //显示该2种严重错误
要想代表真正的“所有错误”,应该写为:E_ERROR | E_STRICT,图示如下:
做法2:在当前的脚本代码中:
跟php.ini中设置其实是一样,举一些例子如下:
ini_set(“error_reporting”, E_NOTICE); //就显示该一个级别的错误
ini_set(“error_reporting”, E_NOTICE | E_WARNING), //显示2个级别
ini_set(“error_reporting”, E_NOTICE | E_WARNING | E_ERROR), //显示3个级别
ini_set(“error_reporting”, E_ALL | E_STRICT), //这才代表显示所有错误!
错误日志的记录问题
错误日志其实就是错误报告,只是它会“写入文件中”,此时就称为错误日志!
也有2个问题,每个问题也有2种做法:
是否记录log_errors:
php.ini中:
log_errors = On 或 Off
脚本中:
ini_set(“log_erros”, 1); 或 0
补充一句:
1:ini_set(“php配置项”, 值); //用于脚本中设置php.ini中是某项的值。
2,:$v1 = ini_get(“php配置项”); //用于获取php.ini中是某项的值
记录到哪里error_log:
一般就只有2个写法:
写法1:直接使用一个文件名,此时系统会自动在每个文件夹下都建立该文件名,并用其记录该文件夹下的所有网页文件发生的错误信息。
然后执行一个有错误的网页,并可以观察到:
其中的内容大约为:
写法2:使用一个特殊的名字“syslog”,则此时所有错误信息都会记录到系统的“日志文件”中。
系统日志文件在这里:控制面板》管理工具》事件查看器》window日志》应用程序:
自定义错误处理器
什么叫错误处理器?
就是一旦发生错误,用来处理该错误的一种“机器”——其实就是一个函数。
自定义错误处理,就是指:
让系统不要去处理错误了,而完全由我们(开发者)来对错误进行处理:显示和记录。
做法,其实非常简单,就2步:
第一步:
设定要用于处理错误的函数名!
set_error_handler(“f1”);
第二步:
去定义该函数!
function f1(){
//这里可以任意写代码:自然正常是去显示错误报告,和记录错误日志。
}
php错误的处理的更多相关文章
- 航空概论(历年资料,引之百度文库,PS:未调格式,有点乱)
航空航天尔雅 选择题1. 已经实现了<天方夜谭>中的飞毯设想.—— A——美国2. 地球到月球大约—— C 38 万公里3. 建立了航空史上第一条定期空中路线—— B——德国4. 对于孔明 ...
- 日期格式代码出现两次的错误 ORA-01810
错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...
- ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...
- 实时的.NET程序错误监控产品Exceptionless
Exceptionless可以对ASP.NET, Web API, WebForms, WPF, Console, 和 MVC 应用提供错误监控.上传.报表服务.使用时需要在Exceptionless ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- SQL Server 致程序员(容易忽略的错误)
标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...
- C# - 值类型、引用类型&走出误区,容易错误的说法
1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...
- 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file
我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...
- 【WCF】错误协定声明
在上一篇烂文中,老周给大伙伴们介绍了 IErrorHandler 接口的使用,今天,老周补充一个错误处理的知识点——错误协定. 错误协定与IErrorHandler接口不同,大伙伴们应该记得,上回我们 ...
随机推荐
- HDU5505
GT and numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- paramiko库安装
python的paramiko库用于执行ssh2连接(client和server).安装方式如下: 硬件环境:Raspberry 2B,arm,1GB RAM,16GB TF卡; 系统环境:Linux ...
- 路由器安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错误。向目标系统中安装busybox-initramfs软件包时出现一个错误。请检查/var/log/syslog或查看第四虚拟控制台以获得详细
公司的路由器要ubuntu服务器进行路由网络功能的管理,在安装的时候出现下面的错误提示: 安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错 ...
- 基于Ceph快照的异地灾备设计
作者:吴香伟 发表于 2017/02/06 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 喜欢请点击右边打赏,谢谢支持! 引子 技术改变生活. 越来越方便的手机 ...
- Ubuntu16.04+Theano环境
安装Anaconda: 官网下载Anaconda 切换到下载目录 cd ~/下载/ 用bash运行下载好的.sh文件 bash Anaconda2--Linux-x86_64.sh 进入欢迎界面 We ...
- PHP 数组处理
一:PHP 定义数组: PHP 代码 不能再 空的位置 打字 会报错 定义数组 方式1 $cars=array("Volvo","BMW","T ...
- fir.im Weekly - 可能是 2017 最好的 Swift 学习资源
春节假期刚结束,一大批新鲜干货就来了.@故胤道长 分享了一份开源 Swift30 Projects ,内含 30 个小App,更新至 Swift 3.0,目前更迭的这个版本更注重代码规范和架构设计,且 ...
- 获取当前用户的网络状态--iOS
http://m.blog.csdn.net/blog/u014483033/39229417
- 剖析Asp.Net Web API路由系统---WebHost部署方式
上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...
- Struts2系列笔记(7)---Struts2类型转换
Struts2类型转换 struts2中内置了大量的类型转换器用来完成数据类型转换的问题,这篇随笔主要通过两个方面来写Struts类型转换 1:Struts2内置的类型转换器 2:如何自定义 ...