在异步代码中捕获异常的位置?

时间:2015-07-20 01:59:27

标签: c# exception async-await try-catch

Task task = AsyncMethod();

// do other stuff

await task;

AsyncMethod()可以抛出异常。我是否将try-catch放在方法调用,await或两者之间?

1 个答案:

答案 0 :(得分:4)

为了避免关于异常处理应该发生在哪里的整个争论,我只是稍微改变你的问题:在哪里可以捕获从AsyncMethod方法抛出的异常。

答案是:你await的位置。

假设您的AsyncMethod方法看起来像这样:

private async Task AsyncMethod()
{
    // some code...
    throw new VerySpecificException();
}

...然后你可以通过这种方式捕捉异常:

Task task = AsyncMethod();

// do other stuff

try
{
    await task;
}
catch(VerySpecificException e) // nice, I can use the correct exception type here.
{
    // do something with exception here.
}

只需对其进行测试,您就会看到await关键字如何完成展开所有工作以及从返回的Task中抛出异常的方式,使try-catch编码感觉非常自然1}}阻止。

相关文档:try-catch

请注意异步方法中的异常部分说明:

  

要捕获异常,请等待try块中的任务,并在关联的catch块中捕获异常。