• 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. python第十一课——转换结构

    3.转换函数:int():float():str():list():tuple():set():dict():bool(): 案例: #演示各个转换函数的使用: 数值型-->字符型使用:str( ...

  2. python-一个小爬虫,爬取图片

    import re import urllib.request # 爬取网页 def getHtml(url): page=urllib.request.urlopen(url) html=page. ...

  3. jenkins ansible

    ansible-playbook - hosts: test remote_user: root vars: warpath: "/root/.jenkins/workspace/172.1 ...

  4. tuple元组详解

    这次要讲的内容是:c++11中的tuple(元组).tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多 ...

  5. error info: boost not variable 问题解决

    错误信息:error info: boost not variable 解决办法:sudo apt-get install libboost-dev 出现这个问题的原因是我在搭建DOMJudgeOJ平 ...

  6. 关于vmware workstation10常见问题

    简单的说明:win7和win10的解决办法都是这个,都可以用这个解决. 这是一个共性的问题. 出现这个问题的原因是: a.要么是系统更新没有及时正确的关闭虚拟机导致的; b.没有及时将虚拟机手动关闭再 ...

  7. 集合之LinkedList

    一.概述 LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口链表的实现.基于链表实现的方式使得L ...

  8. Google免费GPU使用教程(Google Colab Colaboratory)

    参考: https://www.234du.com/1154.html https://mp.weixin.qq.com/s/TGTToLYSQJui94-bQC4HIQ 注册gmail时遇到手机号无 ...

  9. [译]新的CCSDS图像压缩推荐标准

    摘要——空间数据系统咨询委员会(CCSDS)的数据压缩工作组最近通过了图像数据压缩议案,最终版本预计在2005年发布.议案中采用的算法由两部分组成,先是一个对图像的二维离散小波变换,然后是对变换后的数 ...

  10. c++——深拷贝和浅拷贝

    深拷贝和浅拷贝 默认复制构造函数可以完成对象的数据成员值简单的复制 对象的数据资源是由指针指示的堆时,默认复制构造函数仅作指针值复制 1浅拷贝问题 1.c++默认的拷贝构造函数 2.=号操作符 都是浅 ...