前端PHP入门-032-异常处理-应用级别
禁止显示错误
在php.ini配置文件中。我们可以控制php的错误显示状态。
php.ini中有一个专门的配置项:
display_errors
这个选项设置是否将错误信息输出到网页,或者对用户隐藏而不显示。
这个值的状态为on或者off,也可以设值为1或者0。
- display_error的值设为0或者off则不在页面中显示错误,
- 设为1或者on则显示错误信息。
问题:如果没有修改服务器php.ini的状态权限怎么办?
可以使用ini_set。
<?phpini_set('display_errors' , 0 );?>
上面的代码也相当于修改了php.ini中display_errors的值。不过,仅仅在当前php代码中生效。
问题:想取得php.ini的配置项状态怎么办?
可以使用ini_get(参数项) 得到参数的值。
演示例子:
<?phpecho '服务器中display_errors的状态为' . ini_get('display_errors');?>
注:修改完php.ini文件,需要重启服务器。
错误类型
php大家最常见的错误显示截图,本书帮大家进行了总结:
【掌握级别的错误类型】 我们将最常用的错误分为了三种:
| 错误类型 | 说明 |
|---|---|
| E_ERROR | 错误,文件直接中断 |
| E_WARNING | 警告,问题比较严重。但是还会继续向下运行 |
| E_NOTICE | 提示,有些小问题不会影响到程序。常发生在项目未定义 |
| E_PARSE | 编译时语法解析错误。解析错误仅仅由分析器产生。 |
| E_ALL | 所有的错误 |
| E_STRICT | 启用PHP对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。 |
| E_DEPRECATED | 启用后将会对在未来版本中可能无法正常工作的代码给出警告。 |
在上面的几种类型中:
error最严重,必须要解决。不然程序无法继续向下执行warning也很重要。通也必须要解决。如果明确的,故意的可以不用处理。notice你可以不用管。但是在有些公司,项目标准特别高。在高标准要求的项目中也必须要解决。因为,notice会影响到PHP的执行效率。通常发生在函数未定义等。parse错误,是指语法错写错了,必须要解决- 代表全部类型的所有错误
【了解级别的错误类型】 再从这三种扩展出来了另外一些需要了解的错误项:
| 错误类型 | 错误说明 |
|---|---|
| E_CORE_ERROR | 在PHP初始化启动过程中发生的致命错误。该错误类似E_ERROR,但是是由PHP引擎核心产生的 |
| E_CORE_WARNING | PHP初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由PHP引擎核心产生的。 |
| E_COMPILE_ERROR | 致命编译时错误。类似E_ERROR,但是是由Zend脚本引擎产生的。 |
| E_COMPILE_WARNING | 编译时警告(非致命错误)。类似E_WARNING,但是是由Zend脚本引擎产生的 |
| E_USER_ERROR | 用户自定义错误 |
| E_USER_WARNING | 用户自定义警告 |
| E_USER_NOTICE | 用户自定义提示 |
| E_USER_DEPRECATED | 用户产少的警告信息。类似E_DEPRECATED,但是是由用户自己在代码中使用PHP函数trigger_error()来产生的。 |
| E_RECOVERABLE_ERROR | 可被捕捉的致命错误。它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 |
在学习过程中,上面的类型了解即可。因为基本不会遇到,遇到了大家查一下本书或者查一下手册就清楚了。
error_reporting 报告错误类型
error_reporting 是指错误报告。在php.ini中也有这样一个参数。这个参数。决定了PHP引擎记录、报告、显示哪些错误类型。
- 在php.ini中error_reporting参数。如若error_reporting参数设置为0。整个PHP引擎发错误均不会显示、输出、记录。
如果我们想显示所有错误可以写上:
error_reporting = E_ALL
想要显示所有错误但排除提示,可以将这个参数写为:
error_reporting = E_ALL & ~ E_NOTICE
显示所有错误,但排除提示、兼容性和未来兼容性。可写为:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
- 在有些情况下我们无权限操作php.ini文件,又想要控制error_reporting怎么办呢?
在运行的xxxx.php文件中开始处,我们可以使用error_reporting()函数灰达到目标。
演示代码如下:
<?php//关闭了所有的错误显示error_reporting(0);//显示所有错误//error_reporting(E_ALL);//显示所有错误,但不显示提示//error_reporting(E_ALL & ~ E_NOTICE);?>
上面的代码你可以试试,故意写错代码看看。在当前文件中还会不会显示指定的错误。
[扩展、了解知识点]: @ 符是我们之前学习过的单行不显示错误,请不用或者少用@符。
我们拿读取一个不存在的文件,这样的php代码来演示实现过程:
<?php//读取一个不存在的adsaf.txt文件,用@符抑制错误@$fp = fopen('adsaf.txt','r');?>
@符效率较低,它在php内核中的实现过程是:
<?php//关闭错误error_reporting(0);//读取一个不存在的文件,显示错误//显示错误error_reporting(E_ALL & ~ E_NOTICE);?>
错误记录日志
日志收集系统会在背后默默的帮你收集错误、警告、提示。类似Java中的Log4J等等,其中:PHP的错误,警告这些是必须要收信的。
那么问题来了——不让用户看到,设置好错误报告级别好,如何将错误收集到日志系统中呢?
这里有需要使用到php.ini的相关配置项。这两个配置项为:
| 参数 | 配置项 | 说明 |
|---|---|---|
| log_errors | on/off | 是否开启日志记录 |
| log_errors_max_len | 整型,默认1024 | 单行错误最大记录长度 |
| error_log | syslog或者指定路径 | 错误日志记录在什么地方 |
说明:
- 在表格中的log_errors和log_errors_max_len非常好理解。
- 而
error_log指定将错误存在什么路径上。配置项中的syslog可能有点不太好理解。syslog是指系统来记录。windows系统在电脑的日志收集器里面。linux默认在:/etc/syslog.conf
[扩展] 了解知识点。若Linux系统启动或修改了日志收集。可能存储在第三方专用的日志收集服务器中。
此外,PHP还为我们专门准备了一个自定义的错误日志函数:
bool error_log ( string 错误消息[,int" role="presentation" style="position: relative;">错误消息[,int错误消息[,int错误消息类型 = 0 [, string $存储目标]] )
这个函数可以把错误信息发送到web服务器的错误日志,或者到一个文件里。
常用的错误消息类型:
| 错误消息类型 | 说明 |
|---|---|
| 0 | 发送至默认的error_log指定位置 |
| 1 | 发送到指定的邮件位置 |
| 3 | 发送至指定的文件位置 |
示例:
<?php//无法连接到数据库服务器,直接记录到php.ini 中的error_log指定位置error_log("无法连接到数据库服务器服务器");//可以发送邮件,但是php.ini必须配置过邮件系统error_log('可以用邮件报告错误,让运维人员半夜起床干活',1 ,'hanpang8983@foxmail.com');//记录在指定的位置error_log("我是一个错误哟", 3, "d:/test/my-errors.log");?>
注意:
error_log 中发送邮件可能对初学者不熟,您可以不用掌握些块知识。
量力而为,自定义异常函数
这一块知识起点有些高。大多数人没有软件工程、自定义错误处理的经验,很难想象出使用的场景。若你想跳过此块的学习,完全可以,并且我们支持。
此块知识点对于实际应用中应用场景不多。如果,有计划开始要自己写框架时、或者您做完了本书的第一个项目。
您可以回头再来看11.4这一章的内容。
用户自定义错误经常用到的两个函数:
set_error_handler ( callable $回调的错误处理函数)
设置一个用户定义的错误处理函数trigger_error ( string $error_msg)
产生一个用户级别的 error/warning/notice 信息
<?php//定义一个自定义的错误处理函数function customError($errno, $errstr, $errfile, $errline) {//输出错误消息echo "<b>Custom error:</b> [$errno] $errstr<br />";//输出错误文件和错误行echo "Error on line $errline in $errfile<br />";echo "Ending Script";//中止程序运行exit;}//使用set_error_handler 绑定用户自定义函数set_error_handler("customError");$test=2;//触发自定义错误if ($test > 1) {trigger_error("A custom error has been triggered");}?>
前端PHP入门-032-异常处理-应用级别的更多相关文章
- 前端PHP入门-034-Session技术-掌握级别
而Session是通过将数据保存在服务器端来实现保持连接的.我们通过一个例子来了解session的机制. 我们去饮料店买饮料,下单以后服务员会给我们一个号码牌,然后你走到一旁,服务员并不认识你是谁,如 ...
- openresty 前端开发入门五之Mysql篇
openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
- 使用 gulp 搭建前端环境入门篇(转载)
本文转载自: 使用 gulp 搭建前端环境入门篇
- Web前端小白入门指迷
前注:这篇文章首发于我自己创办的服务于校园的技术分享 [西邮 Upper -- 004]Web前端小白入门指迷,写得很用心也就发在这里. 大前端之旅 大前端有很多种,Shell 前端,客户端前端,Ap ...
- Web前端JQuery入门实战案例
前端jquery入门到实战 为什么要学习Jquery?因为生活. 案例: <!DOCTYPE html> <html lang="zh-CN"> <h ...
- Python 入门 之 异常处理
Python 入门 之 异常处理 1.异常处理 (1)程序中的错误分为两种 <1> 语法错误 (这种错误,根本过不了Python解释器的语法检测,必须在程序执行前就改正) # 语法错误示范 ...
- web前端开发入门全套学习方法路径,兼职在家做网站也能月入上万!
前端学习路径 1.WEB前端快速入门 在本阶段,我们需要掌握 HTML 与 CSS 基础,当然,也包含 H5 和 C3 的新特性.这个部分内容非常简单,而且非常容易掌握.相信你也更愿意学习这个部分,毕 ...
- 鸿蒙OS前端开发入门指南:网络图片_Image渲染网络图片
目录: 1.开启明文传输 2.权限申请 3.引入http插件 4.案例展示 5.<鸿蒙OS前端开发入门指南>文章合集 开启明文传输 在config.json配置文件添加如下配置(如果不开启 ...
- 前端PHP入门-028-文件操作-掌握级别
作为刚入门我们员经常会干的意见事情是ctrl+c和ctrl+v,鼠标右键删除文件.会control+c(或右键)复制.粘贴文件以及新建文件,还可以设置文件的是否为只读文件等等 可不可以写入修改配置文件 ...
随机推荐
- AutoCAD2015激活码和密钥
CAD2015序列号和密钥 序列号: 666-69696969 产品密钥: 001G1 序列号: 356-72378422 产品密钥: 206G1 安装说明 ...
- CentOS-6.x系列查看cpu核数
使用CentOS7.x使用习惯了后用top命令,然后按1就可以查看相关的cpu核心数等相关信息 相关概念: 物理CPU:实际Server中插槽上的CPU个数. 物理cpu数量:可以数不重复的 phys ...
- 王者荣耀交流协会final冲刺第五次scrum会议
成员王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐,王磊拍照. master:高远博 2.时间跨度 2017年12月5日 18:00 - 18:31,总计31分钟 3.地点 一食堂二楼沙发座椅 ...
- 60行代码:Javascript 写的俄罗斯方块游戏
哈哈这个实在是有点意思 备受打击当初用java各种类写的都要几百行啦 先看效果图: 游戏结束图: javascript实现源码: [javascript] view plaincopyprint? & ...
- Alpha 冲刺7
队名:日不落战队 安琪(队长) 今天完成的任务 完善回收站. 学习okhttp. 明天的计划 继续研究okhttp. 尝试登录的数据对接. 还剩下的任务 个人信息对接. 遇到的困难 今天白天焊接,晚上 ...
- Nodejs学习笔记(二)--- 操作MongoDB数据库
最近看了一些关于mongodb的文章,然后就想知道nodeJS是怎么连接的所以我就尝试去了解了一波(这个菜鸟驿站这个网站还不错,虽然知识文档不是最新的,但是还是蛮好的: 顺便官网地址是这个哦:http ...
- Centos7安装完毕后联网-设置ip地址(VMware虚拟机)
VMware虚拟机中安装了Centos7,为了让Centos能够访问外网及设置固定的ip地址以方便本地通过SSH访问Centos,做以下几步.本文来自osfipin note. 1.确认虚拟机网络链接 ...
- 第147天:web前端开发中的各种居中总结
一.水平居中 方法① :行内元素 (父元素)text-align,(子元素)inline-block .parent{text-align: center;} .child{display: inli ...
- OpenGL 加载DDS文件(压缩纹理)
想必很多人都见过DDS这种文件,它是一个“图片文件”,如果你安装了某些看图软件,你可以直接双击打开它来进行预览. 那么,这种DDS文件和我们常见的TGA/PNG之类的文件有何不同呢? DDS和TGA/ ...
- [TJOI2013]单词 AC自动机
题面: 洛谷 题解: 很久之前做的题了,只不过之前一直90....最近才发现是哪里写错了. 我们对字符集建AC自动机. 首先考虑一个暴力的做法,把文章当做一个长串,直接在自动机上跳,但是我们会发现,这 ...