例外不会在PHP中通过实例冒泡?

时间:2016-04-21 04:05:05

标签: php exception-handling try-catch

我收到一个关于我的类__toString()方法中引发的异常的错误,即使其中有try...catch()。我做了一些跟踪,结果发现 in 我的实例中的一个对象在 __toString()中抛出异常,这意味着它不是被包含的班级抓住了#39;捉!

我写了一些测试代码作为演示:

class test {
      public function __toString() {
        try {
            $b = new b();
            echo (string)$b;
        } catch (exception $e) {
            return (string)$e;
        }
    }
}

class b {
    public function __toString() {
        throw new Exception ("test");
    }
}

$test = new test();

echo $test;

我原以为异常总是“冒出来”#34;通过代码直到它们被抓住或完全消失。

这有什么解决方法吗?我班上的实例来自图书馆;我不知道我是否可以通过自己的__toString()对其进行维护修改。

1 个答案:

答案 0 :(得分:1)

每个PHP magic methods docs中的__toString()部分:

  

警告

     

您不能在__toString()方法中抛出异常。干   所以会导致致命的错误。

执行代码段时,您会收到一条消息,说明同样的事情:

  

PHP致命错误:方法b :: __ toString()不得抛出异常

有一个功能请求here来支持这一点,它声明在当前状态下很难实现。

说了这么多,解决这个问题的正确方法是向上游库提交一个补丁,不要从该方法中抛出异常。

如果无法做到这一点,那么您的解决方法不是:

echo (string)$b;

echo $b->__toString();

在这种情况下,您可以按预期捕获异常。