调用其他匿名方法的方法中的 PhpStorm @throws 标记

标签 php phpstorm

我的 PhpStorm @throws 标记有问题。

如果为数据库事务创建静态方法:

/**
 * Performs a function in a transaction.
 *
 * @param callable $function Function to call.
 *
 * @throws \Throwable
 */
public static function transaction(callable $function) {...}

这只是 try catch \Throwable 上的任何内容,然后回滚数据库上的事务并再次重新抛出 \Throwable

问题是 PhpStorm 说方法 transaction() 抛出 \Throwable 这是正确的,所以我将该标记放在 doc block 中,但实际上 \Throwable 取决于传递给方法的参数 $function

因此,当 $function 事实上抛出 ModelNotFoundException 时,transaction() 也只能抛出 ModelNotFoundException >.

所以当我创建这样的代码时:

function doSomething(SomeModelClass $model)
{
    Helper::transaction(function () use ($model) {
        $model->otherMethod();
        $model->methodThatCouldThrownAnModelNotFoundException();
        $model->otherMethod2();
        $model->otherMethodEtc();
    });
}

PhpStorm 说我需要添加 try 和 catch 或 throw 标签。 但它说事务抛出 \Throwable 但在这种情况下我可以更具体,因为我知道它可能只是 ModelNotFoundException。但我不能把它作为 @throws 标签,因为然后 PhpStorm 会说, trasaction 只能抛出 \Throwable,所以我需要删除该标记或将 @throws ModelNotFoundException 添加到 transaction 文档 block 。

此时它会发出 2 个警告:

  1. PHPDoc 注释未包含所有必要的 @throws 标记
  2. 未处理的\Throwable

现在我总是添加两行带有 @noinspection 标记的简单行:

/**
 * @throws ModelNotFoundException
 * @noinspection PhpDocMissingThrowsInspection
 */
function doSomething(SomeModelClass $model)
{
    /** @noinspection PhpUnhandledExceptionInspection */
    Helper::transaction(function () use ($model) {
        $model->otherMethod();
        $model->methodThatCouldThrownAnModelNotFoundException();
        $model->otherMethod2();
        $model->otherMethodEtc();
    });
}

我想知道是否有任何方法可以将 transaction 方法中的 @throws 标签与作为参数发送的方法的 @throws 标签关联起来 - $function,因为每次调用此方法时都从​​ noinspection 添加这些注释很烦人。

最佳答案

I wonder if there is any way to associate the @throws tag in the transaction method with the @throws tag of the method sent as a parameter - $function, because it is tiresome to add these comments from noinspection every time this method is called

没有,或者更准确地说:据我所知,没有。

以下是我所知道的:

  1. 未检查的异常:列出您不需要检查的那些(通用)异常(根据您的利益进行配置,未检查的异常是 Phpstorm 的常见功能)。
  2. 包装和冒泡:当您将在事务中调用函数时发生的任何异常转换为事务异常时,请从可抛出对象中创建一个更具体的 TransactionException 并将可抛出对象作为 传递$previous 到其构造函数。

1.允许您有未检查的异常,2. 允许您有检查的异常。


使用示例:

实现2。包裹和气泡:

class TransactionFailedException extends RuntimeException
{}
/**
 * @throws TransactionFailedException
 */
public static function transaction(callable $function): void
{
    try {
        $function();
    } catch (Throwable $failure) {
        throw new TransactionFailedException('Transaction failed', 0, $failure);
    }
}

然后将 TransactionFailedException 添加到未检查的异常中(如果仍然需要,RuntimeException 可能已经存在)。

关于调用其他匿名方法的方法中的 PhpStorm @throws 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72517382/

相关文章:

php - 有没有可能做比这更短的 "if file exists then append, else create new file"

php - 如何为非http请求生成绝对 Assets url

php - 预期响应代码 220 但得到代码 ""和消息 ""

phpstorm - 在 JetBrains IDE(PhpStorm、PyCharm、WebStorm 等)中复制完整文件路径的快捷键

php - 如何在 PhpStorm 中使用 ssh?

php - 我可以从 PHP 创建自己的数据库吗?

phpstorm - 在 PhpStorm 中禁用水平滚动

cakephp-2.0 - 断点cakephp上的phpstorm xdebug eval fatal error

php - 如何防止IDE(PhpStorm)在编辑代码时写入数据库?还有一个幽灵变量

php - laravel seeds 唯一列忽略重复条目