在哪里捕获异步代码中的异常?

dev*_*bmw 2 c# exception try-catch async-await

Task task = AsyncMethod();

// do other stuff

await task;
Run Code Online (Sandbox Code Playgroud)

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

sst*_*tan 5

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

答案是:你在哪里await

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

private async Task AsyncMethod()
{
    // some code...
    throw new VerySpecificException();
}
Run Code Online (Sandbox Code Playgroud)

...然后你可以这样捕获异常:

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.
}
Run Code Online (Sandbox Code Playgroud)

只需测试它,您就会看到await关键字如何完成所有展开工作并从返回的异常Task中抛出异常,这使得对try-catch块进行编码感觉非常自然。

相关文档:try-catch

请注意“异步方法中的异常”部分的内容:

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