c# - 正确使用 return Task.FromException

标签 c# .net .net-4.0 task

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

提交了以下代码:

 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,所以我有以下问题:

  1. 评论者在说什么?
  2. 评论者是否正确?
  3. 为什么不返回 await Task.FromException?
  4. 返回 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());
}

那么让我们一一解答您的问题:

  1. 审稿人说 Task.FromException应该只用于非 async/await方法,在 async 中/await方法,您应该改为重新抛出异常:

    catch (Exception e)
    {
        Log.Logger.Error(e.ToString());
        throw;
    }
    

    或者如果你实现了一个异常过滤器:

    catch (Exception e) when (Log.Logger.ExceptionFilter(e)) { }
    
  2. 是的,审稿人是正确的。

  3. 因为没有必要,所以只重新抛出异常。如果你想抛出异常,就抛出它。 async的目的|/await是能够以正常的方式编写您的方法,因此请编写正常的 throw 语句或正常的 catch block 。
  4. async/await方法,仅此而已。

关于c# - 正确使用 return Task.FromException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444538/

相关文章:

.net - 如何在 .NET 4.5 上使用 .NET 4.0 应用程序?

c# - 如何在 LINQ 查询中指定范围变量的类型?

c# - 将excel中的特定工作表转换为csv

ASP.NET <%= %> 与 <% : %>

.net - 是否可以将 ServiceStack.Text.JsConfig 设置范围限制为您的库?

c# - 使用 ASP.NET 从 Word 文档获取文本框值?

c# - 为 .NET ala Boost.Functional/Hash 创建 'good' 哈希码

c# - 注册(许可)您自己的组件有多重要?

.net - 语义日志记录进程外 ElasticSearch 配置

.net - 在 Reflector 中打开 XNA Xbox 360 程序集