【发布时间】:2021-11-15 23:33:49
【问题描述】:
我在 SonarQube 中弹出了 this 警告,但我不明白为什么需要包装验证。
我已阅读以下问题,但似乎都没有清楚地解释为什么它更好?
Parameter validation in "async"/"await" methods should be wrapped
Validate parameters in async method
在示例中
public async Task DoSomethingAsync(string param){
if(string.IsNullOrEmpty(param)
{
throw new ArgumentException("Param is blank");
}
await DoSomethingElseAsync(param);
}
为什么这会以不同的方式执行
public Task DoSomethingAsync(string param){
if(string.IsNullOrEmpty(param)
{
throw new ArgumentException("Param is blank");
}
return doSomethingElseAsync(param);
}
鉴于调用者都需要等待这两个实现,是否真的可以保证第二个实现中的验证会立即执行,而不是像任何其他异步方法一样被延迟?
【问题讨论】:
-
它归结为异常是如何抛出的:首先,它们不会被抛出给调用者,而是作为返回的 Task 的 Exception 属性返回。第二种是直接扔。考虑
var t = DoSomethingAsync(...); await t;:对于第一个sn-p,await抛出异常。其次,对DoSomethingAsync的调用本身会抛出 -
哪个更好...是个人喜好。例如,Bill Wagner 更喜欢您的第二种方法。如果没记错的话(我目前找不到参考资料),Stephen Toub 更喜欢第一个。
-
您可以换一种方式来考虑这个问题:让您的公共 API 尽可能精简。您的公共 API 会执行初步检查,然后从 API 使用者的角度来看,其他一切都是实施细节。
-
"实际上是否可以保证第二个实现中的验证会立即执行,而不是像任何其他异步方法一样被延迟?" - 是的,因为该方法实际上不使用
async,因此甚至没有从它构建的异步状态机。
标签: c# async-await sonarqube