我最近观察到两个开发人员之间的代码审查。

提交了以下代码:

 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?
  • 返回等待Task.FromException的正确方案是什么?
  • 最佳答案

    审稿人是完全正确的。

    唯一会使用Task.FromException的情况是,当您处于无法使用asyncawait实现的方法时,并且您希望任务的结果应该是一个异常(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/

    10-12 06:34