Php 在析构函数方法中引发异常

Php 在析构函数方法中引发异常,php,exception,destructor,Php,Exception,Destructor,我找不到可靠的源来确保我能够在\uu destruct()中引发异常 这就是php文档所说的 试图从析构函数(在脚本终止时调用)引发异常会导致致命错误 但是当我测试它的时候 class A { public function __destruct() { throw new \Exception(); } } try { $a = new A(); } catch(\Exception $x) { var_dump($x); } 这似

我找不到可靠的源来确保我能够在
\uu destruct()
中引发异常

这就是php文档所说的

试图从析构函数(在脚本终止时调用)引发异常会导致致命错误

但是当我测试它的时候

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

try {
    $a = new A();

} catch(\Exception $x) {
    var_dump($x);
}
这似乎不是真的。我通常抛出并捕获异常。那么,为什么医生有这条线

根据马克·贝克的答案编辑:


它实际上是有效的,异常可以从析构函数中抛出和捕获。我仍然不确定文档为什么存在。

脚本中的任何地方都没有调用析构函数,因此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块的范围

编辑

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

致命错误:未捕获异常


这就是文档警告您的内容,在示例代码中根本没有调用析构函数;试试看,它会抛出一个异常。另外,当脚本终止时会抛出一个异常;但这超出了try/catch的范围,提示是“在脚本终止时调用”。@MarkBaker我怎么会错过这个。。。你完全正确。因此,在析构函数中抛出的异常不能是caught@MarkBaker你能把它作为一个答案贴出来,这样我就能接受它了吗?我测试过了,它很有效。非常感谢。但是为什么文档会说谎?如果你执行我发布的代码,那么当
$a
未设置时引发的异常会被捕获,如果你是对的,我编辑了我的评论,但速度不够快,对不起。文档没有说谎。。。。它只是确定当对象在脚本终止时被销毁时引发的异常无法捕获,从而导致一个
致命错误:未捕获异常
-Mark Bakes,补充您的说法,似乎连set_exception_处理程序都无法“捕获”脚本终止时引发的这些异常,因为我有这个问题,在这里我找到了解释,我想。