PHP核心技术——异常和错误处理
- PHP只有手动抛出异常后才能捕获异常
$a = null;
try {
$a = 5/0;
echo $a,PHP_EOL;
} catch (exception $e) {
$e -> getMessage();
$a = -1;
}
echo $a;
- 对于除零这种“异常”情况,PHP认为这是一个错误,直接触发错误(warning也是错误,只是错误等级不一样),而不会自动抛出异常使程序进入异常流程,故最终a值并不是预想中的-1,也就是说,并没有进入异常分支,也没有处理异常。
// 先定义两个异常类,它们需要继承自系统的exception
class emailException extends exception{
}
class pwdException extends exception{
function __toString(){
return "<div clas=\"error\">Exception{$this->getCode()}:
{$this->getMessage()}
in File:{$this->getFile()}on line:{$this->getLine()}</div>";
//改写抛出异常结果
}
}
// 根据业务需求抛出不同异常
function reg($reginfo=null){
if (empty($reginfo)||!isset($reginfo)) {
throw new Exception("参数非法");
}
if (empty($reginfo['email'])) {
throw new emailException("邮件为空");
}
if ($reginfo['pwd']!=$reginfo['repwd']) {
throw new pwdException("两次密码不一致");
}
echo '注册成功';
}
// 对异常进行分拣并做处理
try {
reg(array('email'=>'waitfox@qq.com','pwd'=>123456,'repwd'=>12345678));
// reg();
}catch (emailException $ee) {
echo $ee->getMessage();
}catch(pwdException $ep){
echo $ep;
echo PHP_EOL,'特殊处理';
}catch(Exception $e){
echo $e->getTraceAsString();
echo PHP_EOL,'其他情况,统一处理';
在下面三种场景下会用到异常处理机制:1.对程序的悲观预测;2.程序的需要和对业务的关注;3.语言级别的健壮性要求
PHP中的异常机制是不足的,绝大多数情况下无法自动抛出异常,必须用if……else先进行判断,再手动抛出异常。手动抛异常的意义不是很大,因为这意味着在代码里已经充分预期到错误的出现,也就算不上真正的“异常”,而是意料之中。同时,这种方式还会使你陷入纷繁复杂的业务逻辑判断和处理中。
PHP错误就是会使脚本运行不正常的情况
错误大致分为以下几类。
deprecated是最低级别的错误,表示“不推荐,不建议”。比如在PHP 5中使用ereg系列的正则匹配函数就会报此类错误。这种错误一般由于使用不推荐的、过时的函数或语法造成的。其虽不影响PHP正常流程,但一般情况下建议修正。
其次是notice。这种错误一般告诉你语法中存在不当的地方。如使用变量但是未定义就会报此错。最常见的,数组索引是字符时没有加引号,PHP就视为一个常量,先查找常量表,找不到再视为变量。虽然PHP是脚本语言,语法要求不严,但是仍然建议对变量进行初始化。这种错误不影响PHP正常流程。
warning是级别比较高的错误,在语法中出现很不恰当的情况时才会报此错误,比如函数参数不匹配。这种级别的错误会导致得不到预期结果,故需要修改代码。
更高级别的错误是fetal error。这是致命错误,直接导致PHP流程终结,后面的代码不再执行。这种问题非改不可。
最高级别的错误是语法解析错误prase error。上面提到的错误都属于PHP代码运行期间错误,而语法解析错误属于语法检查阶段错误,这将导致PHP代码无法通过语法检查。错误级别不止这几个,最主要的都在前面提到了。PHP手册中一共定义了16个级别的错误,最常用的就这几个。
在代码质量或者环境不可控时(比如数据库连接失败),使用error_reporting(0),这样就能屏蔽错误了,正式部署时可以采取这样的策略,防止错误消息泄露敏感信息。另外一个技巧就是在函数前加@符号,抑制错误信息输出,如@mysql_connect()。
参考资料
- [PHP核心技术与最佳实践]
PHP核心技术——异常和错误处理的更多相关文章
- 《java中异常和错误》
异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发 ...
- 拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然
在日常开发中,大多数人的做法是在开发环境时开启调试模式,在产品环境关闭调试模式.在开发的时候可以查看各种错误.异常,但是在线上就把错误显示的关闭. 上面的情形看似很科学,有人解释为这样很安全,别人看不 ...
- 关于Java异常和错误的几个问题
1.Java中什么是Exception? 异常是Java传达给你的系统和程序错误的方式. 在java中,异常功能是通过实现比如Throwable,Exception,RuntimeException之 ...
- SQL2008、SQL2013 执行Transact-SQL 语句或者批处理时发生了异常。错误5120
附加数据库的时候遇到问题,问题描述如下: 附加数据库 对于 服务器"服务器名"失败.(Microsoft.SqlServer.Smo) 执行Transact-SQL 语句或者批处理 ...
- C#管理异常和错误
C#管理异常和错误 1.try/catch捕捉异常的语句块,其中try{}中是写可能会出错的程序代码,catch{}中是抛出异常的代码:一个try后可以有多个catch. 2.异常采用继承层次结构进行 ...
- java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误
/** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...
- 扩展Python模块系列(五)----异常和错误处理
在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...
- chrome console的使用 : 异常和错误的处理 – Break易站
本文内容来自:chrome console的使用 : 异常和错误的处理 – Break易站 利用 Chrome DevTools 提供的工具,您可以修复引发异常的网页和在 JavaScript 中调试 ...
- PHP异常和错误
一.PHP的异常和错误 异常:在程序运行中不符合预期的情况及与正常流程不同的情况.一种不正常的情况,就是按照正常逻辑不该出错,但任然出错的情况,这属于逻辑和业务流程的一种中断,而不是语法错误.PHP只 ...
随机推荐
- Connection:Keep-alive
名词解释: HTTP无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系 如果你要实现一个购 ...
- poj 2289 Jamie's Contact Groups【二分+最大流】【二分图多重匹配问题】
题目链接:http://poj.org/problem?id=2289 Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K ...
- 「GXOI / GZOI2019」旅行者
题目 我还是太傻了 考虑每一条边的贡献,对于一条有向边\((u,v,w)\),我们求出\(k\)个关键点中到\(u\)最近的距离\(dis_1\),以及\(v\)到\(k\)个关键点中最近的距离\(d ...
- 4521: [Cqoi2016]手机号码
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1030 Solved: 609 [Submit][Statu ...
- DQL-联合查询
一.含义union:合并.联合,将多次查询结果合并成一个结果二.语法查询语句1union [all]查询语句2union [all]... 三.意义1.将一条比较复杂的查询语句拆分成多条语句2.适用于 ...
- 解决安装macports更新失败问题
安装 macports 先是卡在开始,xcode的路径指定错误,重新指定一下,然后再sudo port selfupdate,就卡再ports.tar那里不动了.经过google和百度查到参考网 ...
- block本质探寻二之变量捕获
一.代码 说明:本文章须结合文章<block本质探寻一之内存结构>和<class和object_getClass方法区别>加以理解: //main.m #import < ...
- devise的使用
~ 在gemfile中加入 gem 'devise' ~ 终端输入 $ bundle install $ rails generate devise:install ~ 确保登录之后能正常跳转 在co ...
- 利用phar实行php反序列化命令执行(测试环境复现)
测试环境的过程大概是:构成出来的phar文件,并修改为任意后缀上传至服务器.通过index.php中存在的文件操作函数参数可控,把参数设置为 phar://上传文件名 即可导致命令执行. index. ...
- Node.js 从入门到茫然系列——入门篇
在创建服务的时候,我们一般代码就是: var http = require("http"); var server = http.createServer(function(req ...