【SPL标准库专题(10)】SPL Exceptions
嵌套异常
了解SPL异常之前,我们先了解一下嵌套异常。嵌套异常顾名思义就是异常里面再嵌套异常,一个异常抛出,在catch到以后再抛出异常,这时可以通过Exception基类的getPrevious方法可以获得嵌套异常;
<?php
class DBException extends Exception
{
}
class Database
{
/**
* @var PDO object setup during construction
*/
protected $_pdoResource = null;
public function executeQuery($sql)
{
try {
throw new PDOException('PDO error');
} catch (PDOException $e) {
throw new DBException('Query was unexecutable', null, $e);
}
return $numRows;
}
}
try {
$sql = 'select * from user';
$db = new Database('PDO', $connectionParams);
$db->executeQuery($sql);
} catch (DBException $e) {
echo 'General Error: ' . $e->getMessage() . "\n";
// 调用被捕获异常的getPrevious()获得嵌套异常
$pdoException = $e->getPrevious();
echo 'PDO Specific error: ' . $pdoException->getMessage() . "\n";
}
SPL异常
简要的说一下SPL异常的优点:
- 可以为异常抛出提供分类,方便后续有选择性的catch异常;
- 异常语义化更具体,BadFunctionCallException一看就知道是调用错误的未定义方法抛出的错误;
SPL中有总共13个新的异常类型。其中两个可被视为基类:逻辑异常(LogicException )和运行时异常(RuntimeException);两种都继承php异常类。其余的方法在逻辑上可以被拆分为3组:动态调用组,逻辑组和运行时组。
动态调用组包含异常 BadFunctionCallException和BadMethodCallException,BadMethodCallException是BadFunctionCallException(LogicException的子类)的子类。
// OO variant
class Foo
{
public function __call($method, $args)
{
switch ($method) {
case 'doBar': /* ... */ break;
default:
throw new BadMethodCallException('Method ' . $method . ' is not callable by this object');
}
}
}
// procedural variant
function foo($bar, $baz) {
$func = 'do' . $baz;
if (!is_callable($func)) {
throw new BadFunctionCallException('Function ' . $func . ' is not callable');
}
}
逻辑(logic )组包含异常: DomainException、InvalidArgumentException、LengthException、OutOfRangeException组成。
运行时(runtime )组包含异常:
它由OutOfBoundsException、OverflowException、RangeException、UnderflowException、UnexpectedValueExceptio组成。
class Foo
{
protected $number = 0;
protected $bar = null;
public function __construct($options)
{
/** 本方法抛出LogicException异常 **/
}
public function setNumber($number)
{
/** 本方法抛出LogicException异常 **/
}
public function setBar(Bar $bar)
{
/** 本方法抛出LogicException异常 **/
}
public function doSomething($differentNumber)
{
if ($differentNumber != $expectedCondition) {
/** 在这里,抛出LogicException异常 **/
}
/**
* 在这里,本方法抛出RuntimeException异常
*/
}
}
链接参考
http://cn.php.net/manual/zh/class.exception.php
http://cn.php.net/manual/zh/spl.exceptions.php
http://www.oschina.net/translate/exception-best-practices-in-php-5-3
【SPL标准库专题(10)】SPL Exceptions的更多相关文章
- php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)
php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便) 一.总结 直接看代码实例,特别方便易懂 thinkphp控制器利眠宁不支持(说明 ...
- 【SPL标准库专题(1)】 SPL简介
什么是SPL SPL是Standard PHP Library(PHP标准库)的缩写. 根据官方定义,它是"a collection of interfaces and classes th ...
- 【SPL标准库专题(3)】 Classes
我把SPL分为四个部分:Iterator,Classes,Datastructures,Function:而其中classes是就是做一些类的介绍(Iterator与Datastructures相关的 ...
- 【SPL标准库专题(9)】 Datastructures:SplObjectStorage
PHP SPL SplObjectStorage是用来存储一组对象的,特别是当你需要唯一标识对象的时候. PHP SPL SplObjectStorage类实现了Countable,Iterator, ...
- 【SPL标准库专题(2)】 Iterator
Iterator界面 本段内容来自阮一峰老师再加自己的部分注解 SPL规定,所有部署了Iterator界面的class,都可以用在foreach Loop中.Iterator界面中包含5个必须部署的方 ...
- 【SPL标准库专题(6)】 Datastructures:SplPriorityQueue
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头取出.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先取出.优先队列具有最高级先出 (largest-in,fir ...
- 【SPL标准库专题(8)】 Datastructures:SplFixedArray
SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快. 类摘要 SplFixedArray im ...
- 【SPL标准库专题(7)】 Datastructures:SplHeap & SplMaxHeap & SplMinHeap
堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现.根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆.二叉堆还常用于排序(堆排序). 类摘 ...
- 【SPL标准库专题(5)】 Datastructures:SplStack & SplQueue
这两个类都是继承自SplDoublyLinkedList,分别派生自SplDoublyLinkedList的堆栈模式和队列模式:所以放在一起来介绍: 堆栈SplStack # 类摘要 SplStack ...
随机推荐
- 02-01:springboot整合servlet开发
1.通过注解扫描完成servlet组件的注册 1.1 编写servlet,在类上添加(WebServlet注解,就表示该类是一个servlet):@WebServlet(name="Firs ...
- maven-compiler-plugin 指定jdk的版本和编码
为了让maven的jdk编译版本一致, 使用maven-compiler-plugin插件来协助管理 建议新建maven项目后的第一步就是配置该插件 <build> <plugins ...
- 面试:atoi和itoa的实现
1.int atoi(const char* src) nullptr指针 空白字符' ','\t','\n' 符号位 避免值溢出 出错信息保存在全局变脸errnum中 ; int atoi(cons ...
- elasticSearch6源码分析(11)client
1.RestClient /** * Client that connects to an Elasticsearch cluster through HTTP. * <p> * Must ...
- springMVC实现 MultipartFile 多文件上传
1.Maven引入所需的 jar 包(或自行下载) <dependency> <groupId>commons-io</groupId> <artifactI ...
- 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则
前言 楼主这个标题其实有一种作死的味道,为什么呢,这三个东西其实可以分开为三篇文章来写,但是,楼主认为这三个东西又都是高度相关的,应当在一个知识点中.在一次学习中去理解这些东西.才能更好的理解 Jav ...
- 【转载】H5页面列表的无线滚动加载(前端分页)
本代码基于Vue的架构 1.首先,要滚动的内容放在一个‘id=box’ 的div里,对div进行scroll事件的监听 <div id="box" class="m ...
- git将本地项目发布到远端
如果本地有个项目myapp之前没在git上,想上传到git仓库保存,操作如下 1. 在gitee或者github上创建一个新仓库 仓库 2. 在控制台进入本地已有的项目文件夹下 cd myapp 3. ...
- MVC应用程序的jQuery代码重构
先看看这篇<在jQuery定义自己函数>http://www.cnblogs.com/insus/p/3415444.html 程序越看越是有重构的地方. 先看1部分,由于在#16代码有宣 ...
- 干货 unity小贴士
3.以Y轴为依据进行Sprite排序对于2D游戏,将Transparency Sort Mode (Edit > Project Settings > Graphics ) 设置为Cust ...