$previous
构造函数参数中的Exception
表示什么?我怎么能用它?
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 Doc
中找不到任何内容答案 0 :(得分:3)
如果因为捕到异常而抛出异常,则可以将原始异常添加为$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();
}
现在,如果您正在实现一个可以抛出异常的库,那么您可能会使用它,但是您希望将该异常包装在您自己的异常中。这样,客户端的代码只需知道您的异常,而不是代码依赖关系的异常,而不会丢失任何类型的信息。
答案 1 :(得分:1)
原因是PHP 5.3引入了嵌套异常作为PHP基本异常类的默认部分。虽然上面的代码可以使用,但如果你使用PHP 5.3,你可以传递任何以前的异常作为第三个参数,并使用 Exception :: getPrevious()方法来得到一个先前提出的异常。
前一个异常的参数,允许您嵌套异常。在准备记录异常时,您可以选择迭代任何可能的先前抛出和嵌套异常,并记录您需要的任何数据。
什么是嵌套?嵌套是捕获特定异常的能力,通过引用原始异常创建一个新的异常对象。然后,这允许调用者访问从更知名类型的消费库中抛出的异常,还可以访问引发此异常行为的异常。
为什么这有用?通常,这在使用其他代码抛出其自身类型异常的代码中最有用。这可能是利用的代码 更多 http://www.brandonsavage.net/exceptional-php-nesting-exceptions-in-php/