代码之家  ›  专栏  ›  技术社区  ›  hvertous

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

  •  3
  • hvertous  · 技术社区  · 7 年前

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

    php文档就是这么说的

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

    但是当我测试它的时候

    class A 
    {
        public function __destruct()
        {
           throw new \Exception();
        }
    }
    
    try {
        $a = new A();
    
    } catch(\Exception $x) {
        var_dump($x);
    }
    

    看来这不是真的。我通常抛出并捕获异常。那么,为什么医生有这条线?

    根据Mark Baker的回答编辑:

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

    1 回复  |  直到 7 年前
        1
  •  6
  •   Mark Baker    7 年前

    脚本中没有调用析构函数,因此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);
    }
    

    否则,当脚本终止时,PHP会抛出异常,但这超出了try/catch块的范围

    编辑

    如果您的对象未被手动销毁,则无法捕获脚本终止时引发的异常,因为您无法围绕销毁对象的PHP内部终止处理包装try/catch;这就是导致致命错误的原因

    致命错误:未捕获异常

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