PHP 错误与异常处理(一)
PHP 错误与异常处理(一)
异常与错误
-
PHP中的错误:
php中大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。warning、notice都是错误,只是他们的级别不同而已,并且错误是不能被try-catch捕获的。
-
PHP中的异常:
程序在运行中出现不符合预期的情况,允许发生(你也不想让他出现不正常的情况)但他是一种不正常的情况,按照我们的正常逻辑本不该出的错误,但仍然会出现的错误,属于逻辑和业务流程的错误,而不是编译或者语法上的错误。这种我们把他称为异常。
以上是PHP中错误和异常的一个概念,PHP中任何自身的错误或者是非正常的代码都会当做错误对待,并不会以异常的形式抛出,但是也有一些情况会当做异常和错误同时抛出。也就是说,你想在数据库连接失败的时候自动捕获异常是行不通的,因为这就不是异常,是错误。
- 错误等级
要做错误处理,必须得明细错误级别:
Fatal Error:致命错误(脚本终止运行) E_ERROR // 致命的运行错误,错误无法恢复,暂停执行脚本 E_CORE_ERROR // PHP启动时初始化过程中的致命错误 E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR E_USER_ERROR // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR) Parse Error:编译时解析错误,语法错误(脚本终止运行) E_PARSE //编译时的语法解析错误 Warning Error:警告错误(仅给出提示信息,脚本不终止运行) E_WARNING // 运行时警告 (非致命错误)。 E_CORE_WARNING // PHP初始化启动过程中发生的警告 (非致命错误) 。 E_COMPILE_WARNING // 编译警告 E_USER_WARNING // 用户产生的警告信息 Notice Error:通知错误(仅给出通知信息,脚本不终止运行) E_NOTICE // 运行时通知。表示脚本遇到可能会表现为错误的情况. E_USER_NOTICE // 用户产生的通知信息。
由此可知有5类是产生ERROR级别的错误,这种错误直接导致PHP程序退出。
- 简单的错误处理:
PHP代码在运行的过程中,一旦出现错误,就会触发系统的错误处理机制。如果我们配置了错误报告就回直接报告出错误。如图所示:
像这样的处理如果我们的代码在生产上运行,就会暴露很多信息(比如服务器的系统),所以我们会做简单的配置:
第一种: 修改php.ini 配置文件:
error_reporting = E_ALL //将向PHP发送每个错误 display_errors = Off //不显示错误报告 log_errors = On //开启错误日志记录 log_errors_max_log = 1024 //每条日志的最大长度 error_log = G:/myerror.log //指定错误日志文件
注意:由于我们关闭了错误报告,但是错误是存在的,为了排查错误,我们开启了错误日志.
第二种: 不修改配置文件,在代码层处理
error_reporting(E_ALL); //将向PHP发送每个错误 ini_set('display_errors',0); //不显示错误报告 ini_set('log_errors',1); //开启错误日志记录 ini_set('error_log','./error.log'); //指定错误日志文件 test();
运行以上代码,就会发现 当前目录下出现 error.log 的文件,内容如下:
[05-Jul-2018 03:37:38 UTC] PHP Fatal error: Uncaught Error: Call to undefined function test() in D:\phpStudy\WWW\test.php:6 Stack trace: #0 {main} thrown in D:\phpStudy\WWW\test.php on line 6
- 简单的PHP异常处理
function checkNum($number) { return 100/$number; }
如上代码所示: 在调用 checkNum()函数的时候 如果在调用的时候 参数传递为0,就会出现异常,这个时候我们就会用到 异常处理操作:
function checkNum($number) { if($number==0) { throw new Exception("参数不能为0"); } return 100/$number; }
然后在调用的时候:
<?php try { checkNum(2); echo '成功了'; } //捕获异常 catch (Exception $e) { echo '错误信息: ' . $e->getMessage(); }
再比如如下的异常处理:
<?php $pdo = new PDO('mysql://host=wrong_host;dbname=wrong_name'); $count = $pdo->exec("DELETE FROM fruit WHERE colour = 'red'");
我们链接数据库执行删除操作的时候,我们无法确保数据库的地址和用户名输入都是正确的时候,就会使用异常处理操作,来优化我们的代码
try { $pdo = new PDO('mysql://host=wrong_host;dbname=wrong_name'); $count = $pdo->exec("DELETE FROM fruit WHERE colour = 'red'"); } catch (PDOException $e) { $code = $e->getCode(); $message = $e->getMessage(); echo '对不起,业务正忙,请稍后再试'; exit; }
Exception是所有异常的基类。他提供了一下方法给我们用来处理异常:
Exception::getMessage — 获取异常消息内容 Exception::getPrevious — 返回异常链中的前一个异常 Exception::getCode — 获取异常代码 Exception::getFile — 创建异常时的程序文件名称 Exception::getLine — 获取创建的异常所在文件中的行号 Exception::getTrace — 获取异常追踪信息 Exception::getTraceAsString — 获取字符串类型的异常追踪信息 Exception::__toString — 将异常对象转换为字符串 Exception::__clone — 异常克隆
原文链接:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
不可错过的CMS学习笔记
引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助。 CMS出现的初衷、背景和目的? CMS的适用场景? CMS的trade-off是什么?优势、劣势和代价 CMS会回收哪个区域的对象? CMS的GC Roots包括那些对象? CMS的过程? CMS和Full gc是不是一回事? CMS何时触发? CMS的日志如何分析? CMS的调优如何做? CMS扫描那些对象? CMS和CMS collector的区别? CMS的推荐参数设置? 为什么ParNew可以和CMS配合使用,而Parallel Scanvenge不可以? 一、基础知识 CMS收集器:Mostly-Concurrent收集器,也称并发标记清除收集器(Concurrent Mark-Sweep GC,CMS收集器),它管理新生代的方式与Parallel收集器和Serial收集器相同,而在老年代则是尽可能得并发执行,每个垃圾收集器周期只有2次短停顿。 我之前对CMS的理解,以为它是针对老年代的收集器。今天查阅了《Java性能优化权威指南...
- 下一篇
Linux服务器---phpMyAdmin
phpMyAdmin工具 1、检测是否已安装php、php-mysql、apache等工具 [root@localhostsrc]# rpm-qa|grepphp php-cli-5.3.3-26.el6.i686 php-gd-5.3.3-26.el6.i686 php-mysql-5.3.3-26.el6.i686 php-pdo-5.3.3-26.el6.i686 php-5.3.3-26.el6.i686 php-xml-5.3.3-26.el6.i686 php-common-5.3.3-26.el6.i686 [root@localhostsrc]# 2、到phpMyAdmin官网下载“phpMyAdmin”,https://www.phpmyadmin.net/ 3、将下载的软件拷贝到“/var/www/html/”目录下,重命名“phpMyAdmin” [root@localhostdown]# tar–zxvfphpMyAdmin-4.8.2.tar.gz [root@localhostdown]# cp–rphpMyAdmin-4.8.2/var/www/html...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器