• 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核心技术——异常和错误处理的更多相关文章

  1. 《java中异常和错误》

    异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发 ...

  2. 拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然

    在日常开发中,大多数人的做法是在开发环境时开启调试模式,在产品环境关闭调试模式.在开发的时候可以查看各种错误.异常,但是在线上就把错误显示的关闭. 上面的情形看似很科学,有人解释为这样很安全,别人看不 ...

  3. 关于Java异常和错误的几个问题

    1.Java中什么是Exception? 异常是Java传达给你的系统和程序错误的方式. 在java中,异常功能是通过实现比如Throwable,Exception,RuntimeException之 ...

  4. SQL2008、SQL2013 执行Transact-SQL 语句或者批处理时发生了异常。错误5120

    附加数据库的时候遇到问题,问题描述如下: 附加数据库 对于 服务器"服务器名"失败.(Microsoft.SqlServer.Smo) 执行Transact-SQL 语句或者批处理 ...

  5. C#管理异常和错误

    C#管理异常和错误 1.try/catch捕捉异常的语句块,其中try{}中是写可能会出错的程序代码,catch{}中是抛出异常的代码:一个try后可以有多个catch. 2.异常采用继承层次结构进行 ...

  6. java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误

    /** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...

  7. 扩展Python模块系列(五)----异常和错误处理

    在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...

  8. chrome console的使用 : 异常和错误的处理 – Break易站

    本文内容来自:chrome console的使用 : 异常和错误的处理 – Break易站 利用 Chrome DevTools 提供的工具,您可以修复引发异常的网页和在 JavaScript 中调试 ...

  9. PHP异常和错误

    一.PHP的异常和错误 异常:在程序运行中不符合预期的情况及与正常流程不同的情况.一种不正常的情况,就是按照正常逻辑不该出错,但任然出错的情况,这属于逻辑和业务流程的一种中断,而不是语法错误.PHP只 ...

随机推荐

  1. BZOJ 1877 晨跑 拆点费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1877 题目大意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧 ...

  2. Python内置函数.md

    Python3 内置函数 abs(x) 返回一个数的绝对值.参数可以是一个整数或者一个浮点数.如果参数是一个复数,那么将返回它的模. >>> abs(-123456) 123456 ...

  3. golang xorm应用

    github.com/go-xorm/xorm  xorm库 http://www.xorm.io/docs/ 手册 xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便.xo ...

  4. 【转】【iOS开发】打开另一个APP(URL Scheme与openURL)

    目标 平常我们做iOS开发,会经常遇到打开其他的APP的功能.本篇文章讲的就是打开别人的APP的一些知识.我们的目标是: 打开别人的APP 让别人打开我们的APP iOS9的适配问题 使用URL Sc ...

  5. 【转】matplotlib制图——图例legend

    转自:https://www.cnblogs.com/alimin1987/p/8047833.html import matplotlib.pyplot as pltimport numpy as ...

  6. python获取网站http://www.weather.com.cn 城市 8-15天天气

    参考一个前辈的代码,修改了一个案例开始学习beautifulsoup做爬虫获取天气信息,前辈获取的是7日内天气, 我看旁边还有8-15日就模仿修改了下.其实其他都没有变化,只变换了获取标签的部分.但是 ...

  7. Tensorflow-slim 学习笔记(二)第一层目录代码解读

    通过阅读代码来学习,一向时最直接快速的.本章将讲解slim的第一层目录tensorflow/tensorflow/contrib/slim/python/slim的代码. 本层代码主要包括learni ...

  8. RabbitMQ如何保证发送端消息的可靠投递-发生镜像队列发生故障转移时

    上一篇最后提到了mandatory这个参数,对于设置mandatory参数个人感觉还是很重要的,尤其在RabbitMQ镜像队列发生故障转移时. 模拟个测试环境如下: 首先在集群队列中增加两个镜像队列的 ...

  9. fio是如何运行的?

    本文主要介绍fio是如何运行的,并且以单线程.单job为例 fio的入口在fio.c中的main函数,下面列出了main函数,此处只出示了一些调用的关键函数 int main(int argc, ch ...

  10. 笔记:iOS随机数与随机数据集

    //0 到 N - 1 之间的随机整数 NSUInteger r = arc4random_uniform(N); //1 到 N 之间的随机整数 NSUInteger r = arc4random_ ...