如何在phpstan中使用异常模板

How to use exception template in phpstan

提问人:Александр Рязанов 提问时间:10/17/2023 更新时间:10/17/2023 访问量:24

问:

如何使用例外模板,例如: 有一些类抛出异常

/**
 * @implements FooInterface<FooException>
 */
class Foo implements FooInterface
{
    /**
     * @throws FooException
     */
    public function exec(): void
    {
        throw new FooException();
    }
}

实现异常作为模板的接口


/**
 * @template E of Exception
 */
interface FooInterface
{
    /**
     * @throws E
     */
    public function exec(): void;
}

而且我不能使用这个模板。 我收到错误

方法 Test\FooWrapper::exec() 抛出 Exception 的选中异常 E,但 PHPDoc @throws 标记中缺少该异常。 在下一个代码中

/**
 * @template E of Exception
 * @implements FooInterface<E>
 */
readonly class FooWrapper implements FooInterface
{
    /**
     * @param FooInterface<E> $foo
     */
    public function __construct(
        private FooInterface $foo
    ) {}

    /**
     * @throws E
     */
    public function exec(): void
    {
        $this->foo->exec();
    }
}

如果指定@throws E,为什么会缺少异常? 如何向phpstan解释异常取决于模板?

php 模板 异常 静态分析 phpstan

评论

1赞 Ondřej Mirtes 10/17/2023
只需在 PHPStan 的 GitHub 上打开错误报告,谢谢。

答: 暂无答案