异步/等待异常处理模式

33

我在我的代码中有如下经常出现的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无法运行。

任务将抛出一个“AggregateException”。这是您要捕获的吗?还是您想要捕获特定的异常? - Simon Whitehead
1个回答

53

我认为这个方法应该可以正常工作,假设GetContacts是一个async方法:

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

顺便提一下,你应该避免使用 async void(正如我在我的MSDN文章中所描述的),并且Async后缀结束你的async方法名称


谢谢,这个有效。我还需要检查一下结果是否为空(if(currentContacts!= null)ShowContacts();),但是模式很清晰。 - user1231595
如果我调用你上面的方法 await CheckForExceptionAsync,它会在代码中抛出一个聚合异常而不是捕获它。这是它应该工作的方式吗? - The Muffin Man
1
@TheMuffinMan:除非 HandleException 抛出 AggregateException。如果您有可重现的情况,请随时将其发布为问题。 - Stephen Cleary
我认为这是我的代码中的外部问题。谢谢回复。 - The Muffin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接