在析构函数方法中抛出异常

hve*_*ous 3 php destructor exception

我找不到可靠的来源,以确保我能够在内部抛出异常__destruct().

这就是php文档所说的

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

但是当我测试它时

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

try {
    $a = new A();

} catch(\Exception $x) {
    var_dump($x);
}
Run Code Online (Sandbox Code Playgroud)

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

马克·贝克回答后编辑:

它实际上工作,异常可以抛出并从析构函数中捕获.我仍然不确定为什么文档存在.

Mar*_*ker 6

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

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

try {
    $a = new A();
    unset($a);
} catch(\Exception $x) {
    var_dump($x);
}
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

致命错误:未捕获的异常

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

  • 文档不存在......它只是标识在脚本终止时销毁对象时抛出的异常无法捕获,从而导致"致命错误:未捕获异常" - [演示](https:// 3v4l.org/YDv1D) (2认同)