簡體   English   中英

如何處理返回 Task 的異步方法中的異常<something></something>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM