【SPL标准库专题(4)】Exceptions

栏目: 数据库 · 发布时间: 6年前

内容简介:了解SPL异常之前,我们先了解一下嵌套异常。嵌套异常顾名思义就是异常里面再嵌套异常,一个异常抛出,在catch到以后再抛出异常,这时可以通过简要的说一下SPL异常的优点:SPL中有总共13个新的异常类型。其中两个可被视为基类:逻辑异常(LogicException )和运行时异常(RuntimeException);两种都继承php异常类。其余的方法在逻辑上可以被拆分为3组:动态调用组,逻辑组和运行时组。

嵌套异常

了解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异常的优点:

  1. 可以为异常抛出提供分类,方便后续有选择性的catch异常;
  2. 异常语义化更具体,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异常 
         */  
    } 
  
}

自定义其它异常

class ThrowableError extends \ErrorException
{
    public function __construct(\Throwable $e)
    {
        // 可以通过instanceof来判断异常分类(做一个映射)
        if ($e instanceof \ParseError) {
            $message  = 'Parse error: ' . $e->getMessage();
            $severity = E_PARSE;
        } elseif ($e instanceof \TypeError) {
            $message  = 'Type error: ' . $e->getMessage();
            $severity = E_RECOVERABLE_ERROR;
        } else {
            $message  = 'Fatal error: ' . $e->getMessage();
            $severity = E_ERROR;
        }
    }
}

链接参考


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大象无形:虚幻引擎程序设计浅析

大象无形:虚幻引擎程序设计浅析

罗丁力、张三 / 电子工业出版社 / 2017-4 / 65

《大象无形:虚幻引擎程序设计浅析》以两位作者本人在使用虚幻引擎过程中的实际经历为参考,包括三大部分:使用C++语言进行游戏性编程、了解虚幻引擎本身底层结构与渲染结构、编写插件扩展虚幻引擎。提供了不同于官方文档内容的虚幻引擎相关细节和有效实践。有助于读者一窥虚幻引擎本身设计的精妙之处,并能学习到定制虚幻引擎所需的基础知识,实现对其的按需定制。 《大象无形:虚幻引擎程序设计浅析》适合初步了解虚幻......一起来看看 《大象无形:虚幻引擎程序设计浅析》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换