我最近观察了两个开发人员之间的代码审查。
提交了以下代码:
public async Task<List<Thing>> GetThings()
{
try
{
var endpoint = $"{Settings.ThingEndpoint}/things";
var response = await HttpClient.GetAsync(endpoint);
return JsonConvert.DeserializeObject<List<Thing>>(await response.Content.ReadAsStringAsync());
}
catch (Exception e)
{
Log.Logger.Error(e.ToString());
return await Task.FromException<List<Thing>>(e);
}
}
其中收到了如下评论意见:
There is absolutely no need to return await Task.FromException>(e), this is something you do when dealing with non awaited task. In this case the catch will capture whatever exception var response = await HttpClient.GetAsync(endpoint); will throw. You should just remove it and catch the exception as is
我不完全理解为什么在这种情况下不使用 Task.FromException,所以我有以下问题:
- 评论者在说什么?
- 评论者是否正确?
- 为什么不返回 await Task.FromException?
- 返回 await Task.FromException 的正确方案是什么?
最佳答案
审稿人完全正确。
您唯一会使用的情况 Task.FromException
是当您使用无法或不会使用 async
实现的方法时和 await
,并且您希望任务的结果应该是一个异常。
白痴的例子,但无论如何:
public Task<int> NotReallyAsync()
{
if (new Random().Next(2) == 0)
return Task.FromResult(42);
return Task.FromException<int>(new InvalidOperationException());
}
那么让我们一一解答您的问题:
审稿人说
Task.FromException
应该只用于非async
/await
方法,在async
中/await
方法,您应该改为重新抛出异常:catch (Exception e) { Log.Logger.Error(e.ToString()); throw; }
或者如果你实现了一个异常过滤器:
catch (Exception e) when (Log.Logger.ExceptionFilter(e)) { }
是的,审稿人是正确的。
- 因为没有必要,所以只重新抛出异常。如果你想抛出异常,就抛出它。
async
的目的|/await
是能够以正常的方式编写您的方法,因此请编写正常的 throw 语句或正常的 catch block 。 - 非
async
/await
方法,仅此而已。
关于c# - 正确使用 return Task.FromException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444538/