【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 ...
随机推荐
- JVM(三)JVM的ClassLoader类加载器
1.类加载的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括: (1)加载 (2)验证 (3)准备 (4)解析 (5)初始化 (6)使用 (7)卸载 一共7个阶段.其中验 ...
- 磁盘分区以及Linux目录挂载详解
一.背景 一直以来,对于磁盘的分区以及Linux目录挂载的概念都不是很清晰,现在趁着春暖花开周末在家没事就研究了下它们,现在来分享我的理解. 二.概念详解 1.磁盘分区 磁盘分区是把物理的磁盘空间按照 ...
- mpvue图片轮播遇到的问题
小程序官方写法: <swiper indicator-dots="{{indicatorDots}}" autoplay="{{autoplay}}" i ...
- jmeter接口自动化部署jenkins教程
首先,保证本地安装并部署了jenkins,jmeter,xslproc 我搭建的自动化测试框架是jmeter+jenkins+xslproc ---注意:原理是,jmeter自生成的报告jtl文件,通 ...
- 解读Secondary NameNode的功能
1.概述 最近有朋友问我Secondary NameNode的作用,是不是NameNode的备份?是不是为了防止NameNode的单点问题?确实,刚接触Hadoop,从字面上看,很容易会把Second ...
- VS和Eclipse的调试功能哪个更强大?
以前一直用VS 2012来调试C/C++代码,F5.F10.F11用起来甚是顺手,前面也写过一篇关于VS最好用的快捷键:Visual Studio最好用的快捷键(你最喜欢哪个), 所以对于调试C/C+ ...
- logstash-2-插件配置
配置语法: Logstash必须有一个 input 和一个 output 1, 处理输入的input 1), 从文件录入 logstash使用一个名为 filewatch的 ruby gem库来监听 ...
- mysql计算排名 转
from :http://www.cnblogs.com/aeiou/p/5719396.html http://www.cnblogs.com/zengguowang/p/5541431.html ...
- 【nginx笔记】系统参数设置-使Nginx支持更多并发请求的TCP网络参数
首先,需要修改/etc/sysctl.conf来更改内核参数.例如,最常用的配置: fs.file-max = 999999 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tc ...
- 并发编程——ConcurrentHashMap#addCount() 分析
前言 ConcurrentHashMap 精华代码很多,前面分析了 helpTransfer 和 transfer 和 putVal 方法,今天来分析一下 addCount 方法,该方法会在 putV ...