Exception类中的$previous是什么?

5
< p >在< code > Exception 构造函数参数中,< code > $previous 表示什么? 我应该如何使用它?< /p >
    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文档中没有找到任何内容。


2
请参阅此链接:http://php.net/manual/en/language.exceptions.extending.php,特别是用户提供的注释非常有帮助。 - pritesh
请查看这份文档:http://php.net/manual/zh/exception.getprevious.php。`$previous` 是先前抛出的异常对象。 - Rajesh Kumar
2个回答

17

如果您因捕获异常而抛出异常,可以将原始异常添加为$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();
}

如果您正在实现一个可能会引发异常的库,但希望将该异常封装在自己的异常中,则可能会使用此选项。这样,您客户端的代码只需知道您的异常,而不需要了解您代码所依赖的其他异常,同时不会失去任何类型的信息。


2
原因是PHP 5.3引入了嵌套异常作为PHP基础异常类的默认部分。虽然上面的代码可以工作,但如果您使用的是PHP 5.3,则可以将任何先前的异常作为第三个参数传递,并使用Exception::getPrevious()方法获取以前引发的异常。
先前异常的参数,允许您嵌套异常。在准备记录异常时,您可以选择遍历任何可能已经抛出并嵌套的异常,并记录您需要的任何数据。
什么是嵌套?嵌套是捕获特定异常的能力,创建一个新的异常对象以引用原始异常。这样一来,调用者就可以访问从消耗库中抛出的异常和更为知名的类型,还可以访问导致此异常行为的异常。
这有什么用处?通常,这在消耗自己类型的其他代码抛出异常的代码中最有用。这可能是利用的代码的代码 要了解更多信息,请访问http://www.brandonsavage.net/exceptional-php-nesting-exceptions-in-php/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接