[英]How to handle exceptions in async methods that return Task<Something>
我被要求在中間件層中引入異常日志記錄。 從上到下這個中間件的調用如下:
//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
}
}
有沒有辦法可以創建一個調用方法並在那里進行日志記錄的 class,例如 return await LogInvoker.Invoke(_repository.GetFooAsync...)
? 或者這是否需要重構層之間的電流?
你必須在catch
塊的末尾做點什么。 您在問題評論中提到,如果出現問題,您准備返回一個空列表:
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.