async/await异常处理模式

use*_*595 31 .net c# async-await

我的代码中有以下重复出现的try/catch模式.使用try/catch块来处理在orionProxy中调用方法时抛出的任何异常.

async private void doGetContacts()
{
    try {
        currentContacts = await orionProxy.GetContacts (); // call method in orionProxy
        ShowContacts (); // do something after task is complete
    }
    catch (Exception e) {
        orionProxy.HandleException (e); // handle thrown exception
    }
}
Run Code Online (Sandbox Code Playgroud)

我想写的是以下内容.

async private void doGetContacts()
{
    currentContacts = await orionProxy.CheckForException(orionProxy.GetContacts ());
    ShowContacts (); // do something after task is complete but shouldn't run on exception
}
Run Code Online (Sandbox Code Playgroud)

任何指针/建议?我尝试过各种形式的Actions/Tasks/Lambdas,但是没有什么能在orionProxy.CheckForException(?)中正确捕获异常,因此ShowContacts不会运行.

Ste*_*ary 51

我不明白为什么它不起作用,假设GetContacts是一种async方法:

public async Task<T> CheckForExceptionAsync<T>(Task<T> source)
{
  try
  {
    return await source;
  }
  catch (Exception ex)
  {
    HandleException(ex);
    return default(T);
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,您应该避免async void(正如我在MSDN文章中所述)并使用后缀结束您的async方法名称Async.