我最近观察到两个开发人员之间的代码审查。
提交了以下代码:
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);
}
}
其中收到以下评论意见:
我不完全理解为什么在这种情况下不使用Task.FromException,所以我有以下问题:
最佳答案
审稿人是完全正确的。
唯一会使用Task.FromException
的情况是,当您处于无法使用async
和await
实现的方法时,并且您希望任务的结果应该是一个异常(exception)。
愚蠢的例子,但无论如何:
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/