Symfony2 Exception类,为什么要使用throw new class?

时间:2012-09-17 18:33:19

标签: php symfony

我正在查看Symfony2类,我发现了类似这样的内容

try {
            return $this->parseSelectorGroup($stream);
        } catch (\Exception $e) {
            $class = get_class($e);

            throw new $class(sprintf('%s at %s -> %s', $e->getMessage(), implode($stream->getUsed(), ''), $stream->peek()), 0, $e);
        }

为什么他们使用

        $class = get_class($e);

        throw new $class

这样的语法。那是什么目的?

1 个答案:

答案 0 :(得分:2)

我不是那行代码的原作者所以我只能假设为什么要这样做。

如代码所示,异常的标准消息正在扩展,其中包含字符串处理类的其他信息(getUsed,peek - 听起来像流缓冲区/解析器/ scanner / peeker)。

编辑消息,然后抛出同一类的新对象。

通常:当你在变量中有一个类名并想要创建该类的新实例时,你可以简单地使用:

$className = "ClassName";
$instance = new $className();

这是使用catched exception classname完成的,请参阅get_class

进一步注意:这段代码在概念上被破坏了,因为它使用了一个带有未定义接口的类作为它的构造函数。然后它使用构造函数,而不知道它的构造函数。

可能会隐藏一些信息,但不会发生这样的情况。所以这只是一个进一步的说明。你应该有具体的理由去做那样的事情,所以这样做是有原因的,并且可能有一些设计决定没有记录你发布的一些代码行。所以小心处理。