C# 在哪里捕获异步代码中的异常?
C# 在哪里捕获异步代码中的异常?,c#,exception,async-await,try-catch,C#,Exception,Async Await,Try Catch,AsyncMethod()可以引发异常。我是将try-catch放在方法调用的周围,还是将wait,或者两者都放在一起?为了避免整个关于异常处理应该发生在哪里的争论,我将您的问题稍微改为:在哪里可以捕获从asynchmethod方法引发的异常 答案是:你在哪里等待它 假设您的AsyncMethod方法如下所示: Task task = AsyncMethod(); // do other stuff await task; 。。。然后可以通过以下方式捕获异常: private async
AsyncMethod()
可以引发异常。我是将try-catch放在方法调用的周围,还是将wait
,或者两者都放在一起?为了避免整个关于异常处理应该发生在哪里的争论,我将您的问题稍微改为:在哪里可以捕获从asynchmethod
方法引发的异常
答案是:你在哪里等待它
假设您的AsyncMethod
方法如下所示:
Task task = AsyncMethod();
// do other stuff
await task;
。。。然后可以通过以下方式捕获异常:
private async Task AsyncMethod()
{
// some code...
throw new VerySpecificException();
}
只要测试一下,您就会看到await
关键字如何从返回的Task
中展开并抛出异常,以一种编写try catch
块感觉非常自然的方式
相关文件:
请注意异步方法中的异常部分所说的内容:
要捕获异常,请在try块中等待任务,然后在关联的catch块中捕获异常
为了避免整个关于异常处理应该发生在哪里的争论,我将您的问题稍微改为:在哪里可以捕获从
asynchmethod
方法抛出的异常
答案是:你在哪里等待它
假设您的AsyncMethod
方法如下所示:
Task task = AsyncMethod();
// do other stuff
await task;
。。。然后可以通过以下方式捕获异常:
private async Task AsyncMethod()
{
// some code...
throw new VerySpecificException();
}
只要测试一下,您就会看到await
关键字如何从返回的Task
中展开并抛出异常,以一种编写try catch
块感觉非常自然的方式
相关文件:
请注意异步方法中的异常部分所说的内容:
要捕获异常,请在try块中等待任务,然后在关联的catch块中捕获异常
@RonBeyer我的问题是关于async/await的。在这些链接页面的任何地方都找不到
async
或wait
。很抱歉,我错过了wait部分,这就是我在平板电脑和@RonBeyer上冲浪得到的。我的问题是关于async/wait的。在这些链接页面的任何地方都找不到async
或wait
字样。很抱歉,我错过了wait部分,这就是我在网上冲浪时得到的tablet@Micky:是的,但是在这种情况下,OP显然返回了一个任务
,这是正常情况。谢谢。不管怎样,你对我问题的重新表述更符合我的要求;)阅读链接文档后,我对它有了更好的理解-实际上是await
导致了异常,因为任务处于故障状态。现在说得通了,谢谢@sstan@Brett:是的,没错。wait关键字打开并抛出异常,使其行为相当透明,甚至可以抛出正确的原始异常类型,而不是更烦人的AggregateException。@亲爱的downvoter:我随时愿意学习。如果我说错了什么,不要害怕留下评论。我不会咬:)@Micky:是的,但在这种情况下,OP显然返回了一个任务
,这是正常情况。谢谢。不管怎样,你对我问题的重新表述更符合我的要求;)阅读链接文档后,我对它有了更好的理解-实际上是await
导致了异常,因为任务处于故障状态。现在说得通了,谢谢@sstan@Brett:是的,没错。wait关键字打开并抛出异常,使其行为相当透明,甚至可以抛出正确的原始异常类型,而不是更烦人的AggregateException。@亲爱的downvoter:我随时愿意学习。如果我说错了什么,不要害怕留下评论。我不会咬:)