我的 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 个警告:
- PHPDoc 注释未包含所有必要的
@throws
标记 - 未处理的
\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
没有,或者更准确地说:据我所知,没有。
以下是我所知道的:
- 未检查的异常:列出您不需要检查的那些(通用)异常(根据您的利益进行配置,未检查的异常是 Phpstorm 的常见功能)。
- 包装和冒泡:当您将在事务中调用函数时发生的任何异常转换为事务异常时,请从可抛出对象中创建一个更具体的 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/