Exception类中的$ previous是什么?

时间:2016-01-27 07:09:48

标签: php exception

$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

中找不到任何内容

2 个答案:

答案 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/