【问题标题】:How to handle exceptions in async methods that return Task<Something>如何处理返回 Task<Something> 的异步方法中的异常
【发布时间】:2020-06-26 15:15:49
【问题描述】:

我有责任在中间件层中引入异常日志记录。这个中间件从上到下的调用如下:

//In layer C
public async Task<List<Foo>> GetFoo(GetFooRequest request)
{
    return await _repository.GetFooAsync(request);
} 

//In layer D
public async Task<List<Foo>> GetFooAsync(GetFooRequest request)
{
    return await _context.Foo.Where(x=> x.FooId=request.FooID).ToListAsync();
} 

我想登录 C 层,但是,Task 返回一个 System.Void,因此编译器会抱怨下面的代码。我明白为什么下面的代码会失败,但我在寻找解决方案模式或登录 C 层的做法时遇到问题。

 //In layer C
public async Task<List<Foo>> GetFoo(GetFooRequest request)
{
    try
    {
        return await _repository.GetFooAsync(request);
    }
    catch(Exception e)
    {
        base.LogException(e)      //<- Not all code paths return a value
    }
} 

有没有一种方法可以创建一个调用方法并在那里进行日志记录的类,例如 return await LogInvoker.Invoke(_repository.GetFooAsync...)?或者这是否需要重构层之间的电流流动?

【问题讨论】:

  • 既然你捕捉到了异常,那么在你调用 "LogException` 之后你想返回什么值?它要么必须是某种List&lt;&gt;,要么你重新抛出异常。
  • 可能是一个空列表。这似乎比再次抛出异常要好。
  • 这样更好吗?现在调用方法不知道出了什么问题,所以它会愉快地继续。也许它会起作用,也许它不会;也许它会返回一个预期的结果,也许它不会。
  • 一般模式是,如果你要求的东西应该在那里,但它不在那里,空或 null,那么这意味着获取它时出现问题并且错误已经记录。顶层是轻量级的并且没有日志记录,如果需要,他们可以将任何内容返回给客户端 403 或其他内容。尽管某些情况(例如搜索功能)可能只会返回“未找到”。但至少内部会知道错误。
  • 我知道这是一个完全愚蠢的问题,因为我已经摆脱了杂草并回头看它。我一次处理了 100 件与 DI 和线程相关的事情,并认为红色波浪线是与我的模式相关的编译器错误。我没有意识到最简单的问题是我没有返回结果。我认为异步模式导致了一个问题。我会删除这篇文章,但不想惩罚回答的人。谁知道有人会从中找到用处,如果不是嘲笑我暂时失去所有明智的东西。

标签: c# async-await task


【解决方案1】:

你必须在catch 块的末尾做点什么。您在问题 cmets 中提到,如果出现问题,您准备返回一个空列表:

public async Task<List<Foo>> GetFoo(GetFooRequest request)
{
    try
    {
        return await _repository.GetFooAsync(request);
    }
    catch(Exception e)
    {
        base.LogException(e);
        return new List<Foo>();
    }
} 

或重新抛出异常,如果这对您的应用程序有意义:

public async Task<List<Foo>> GetFoo(GetFooRequest request)
{
    try
    {
        return await _repository.GetFooAsync(request);
    }
    catch(Exception e)
    {
        base.LogException(e);
        throw;
    }
} 

【讨论】:

  • 我认为 log 和 return null 会起作用。对我来说,null 意味着出了点问题。
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 2018-09-01
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多