异常类中$previous的内容


What is $previous in Exception class?

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/