在析构函数方法

时间:2017-12-13 12:25:23

标签: php exception destructor

我无法找到可靠的来源以确保我能够在__destruct()内抛出异常。

这就是php文档所说的

  

尝试从析构函数中抛出异常(在脚本终止时调用)会导致致命错误。

但是当我测试它时

class A 
{
    public function __destruct()
    {
       throw new \Exception();
    }
}

try {
    $a = new A();

} catch(\Exception $x) {
    var_dump($x);
}

似乎这不是真的。我通常抛出并捕获异常。那么,为什么文档得到这条线?

在Mark Ba​​ker的回答后编辑:

它确实有效,异常​​可以抛出并从析构函数中捕获。我仍然不确定为什么文件存在。

1 个答案:

答案 0 :(得分:6)

析构函数不会在脚本中的任何位置被调用,因此try / catch块不会捕获任何内容。如果你在try / catch块中unset($x),那么将抛出异常并正常捕获。

class A {
    public function __destruct() {
       throw new \Exception();
    }
}

try {
    $a = new A();
    unset($a);
} catch(\Exception $x) {
    var_dump($x);
}

否则,PHP会在脚本终止时抛出异常,但这不在你的try / catch块之外

修改

如果你的对象没有被手动销毁,那么在脚本终止时引发的异常无法被捕获,因为你无法在PHP的内部终止处理中包装try / catch来破坏对象;这就是导致致命错误的原因

  

致命错误:未捕获的异常

所以这就是文档警告你的内容