async / await异常处理模式

时间:2013-10-02 23:28:58

标签: c# .net 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
    }
}

我想写的内容如下:

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

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

1 个答案:

答案 0 :(得分:51)

我不明白为什么它不起作用,假设GetContactsasync方法:

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

在旁注中,您应该avoid async void(正如我在MSDN文章中所述)和end your async method names with the Async suffix