[关闭]
@a5635268 2016-04-26T11:18:07.000000Z 字数 2144 阅读 1236

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

PHP SPL


嵌套异常

了解SPL异常之前,我们先了解一下嵌套异常。嵌套异常顾名思义就是异常里面再嵌套异常,一个异常抛出,在catch到以后再抛出异常,这时可以通过Exception基类的getPrevious方法可以获得嵌套异常;

  1. <?php
  2. class DBException extends Exception
  3. {
  4. }
  5. class Database
  6. {
  7. /**
  8. * @var PDO object setup during construction
  9. */
  10. protected $_pdoResource = null;
  11. public function executeQuery($sql)
  12. {
  13. try {
  14. throw new PDOException('PDO error');
  15. } catch (PDOException $e) {
  16. throw new DBException('Query was unexecutable', null, $e);
  17. }
  18. return $numRows;
  19. }
  20. }
  21. try {
  22. $sql = 'select * from user';
  23. $db = new Database('PDO', $connectionParams);
  24. $db->executeQuery($sql);
  25. } catch (DBException $e) {
  26. echo 'General Error: ' . $e->getMessage() . "\n";
  27. // 调用被捕获异常的getPrevious()获得嵌套异常
  28. $pdoException = $e->getPrevious();
  29. echo 'PDO Specific error: ' . $pdoException->getMessage() . "\n";
  30. }

SPL异常

简要的说一下SPL异常的优点:

  1. 可以为异常抛出提供分类,方便后续有选择性的catch异常;
  2. 异常语义化更具体,BadFunctionCallException一看就知道是调用错误的未定义方法抛出的错误;

SPL中有总共13个新的异常类型。其中两个可被视为基类:逻辑异常(LogicException )和运行时异常(RuntimeException);两种都继承php异常类。其余的方法在逻辑上可以被拆分为3组:动态调用组,逻辑组和运行时组。

动态调用组包含异常 BadFunctionCallException和BadMethodCallException,BadMethodCallException是BadFunctionCallException(LogicException的子类)的子类。

  1. // OO variant
  2. class Foo
  3. {
  4. public function __call($method, $args)
  5. {
  6. switch ($method) {
  7. case 'doBar': /* ... */ break;
  8. default:
  9. throw new BadMethodCallException('Method ' . $method . ' is not callable by this object');
  10. }
  11. }
  12. }
  13. // procedural variant
  14. function foo($bar, $baz) {
  15. $func = 'do' . $baz;
  16. if (!is_callable($func)) {
  17. throw new BadFunctionCallException('Function ' . $func . ' is not callable');
  18. }
  19. }

逻辑(logic )组包含异常: DomainException、InvalidArgumentException、LengthException、OutOfRangeException组成。

运行时(runtime )组包含异常:
它由OutOfBoundsException、OverflowException、RangeException、UnderflowException、UnexpectedValueExceptio组成。

  1. class Foo
  2. {
  3. protected $number = 0;
  4. protected $bar = null;
  5. public function __construct($options)
  6. {
  7. /** 本方法抛出LogicException异常 **/
  8. }
  9. public function setNumber($number)
  10. {
  11. /** 本方法抛出LogicException异常 **/
  12. }
  13. public function setBar(Bar $bar)
  14. {
  15. /** 本方法抛出LogicException异常 **/
  16. }
  17. public function doSomething($differentNumber)
  18. {
  19. if ($differentNumber != $expectedCondition) {
  20. /** 在这里,抛出LogicException异常 **/
  21. }
  22. /**
  23. * 在这里,本方法抛出RuntimeException异常
  24. */
  25. }
  26. }

链接参考

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注