Exception
构造函数参数中的$previous
表示什么?我该如何使用它?
class MyException extends 'Exception {
private $message;
private $code;
public function __construct($message,$code,'Exception $previous=null){
$this->message = $message;
$this->code = isset($code) ? $code : 0;
parent::__construct($message,$code,$previous);
}
}
我在 API 文档中找不到任何内容
如果因为捕获异常而引发异常,则可以将原始异常添加为$previous
。这意味着您实际上可以"嵌套"异常:
try {
throw new FooException('Foo exception');
} catch (FooException $e) {
$code = 1;
throw new BarException('Bar exception', $code, $e);
}
然后,您可以遍历异常"堆栈",而不仅仅是捕获的异常,从而为您提供更多上下文。
while($e instanceof 'Exception) {
echo $e->getMessage();
$e = $e->getPrevious();
}
现在,如果您正在实现一个可以引发异常的库,但您希望将该异常包装在您自己的库中,则可能会使用它。这样,客户端的代码只需要知道您的异常,而不是代码依赖项具有的异常,同时不会丢失任何类型的信息。
原因是 PHP
5.3 引入了嵌套异常作为 PHP 基本异常类的默认部分。虽然上面的代码可以工作,但如果你使用的是 PHP 5.3,你可以将任何以前的异常作为第三个参数传递,并使用 Exception::getPrevious() 方法来获取以前引发的异常。
上一个异常的参数,允许您嵌套异常。准备记录异常时,可以选择循环访问任何可能以前引发和嵌套的异常,并记录所需的任何数据。
什么是嵌套?嵌套是捕获特定异常的能力,创建一个新的异常对象,引用原始异常。然后,这允许调用方访问从更知名的类型的已使用库中引发的异常,但也允许调用方访问产生此异常行为的异常。
为什么这很有用?通常,这在使用引发其自身类型的异常的其他代码的代码中最有用。这可能是利用了解更多http://www.brandonsavage.net/exceptional-php-nesting-exceptions-in-php/