假设我有一个异步方法:
public async Task Do()
{
await Task.Delay(1000);
}
另一种方法是尝试在Do
块
catch
方法
public async Task DoMore()
{
try
{
}
catch (Exception)
{
await Do(); //compiled error.
}
}
但是这样,编译器不允许在await
内使用catch
,为什么我们不能以这种方式使用它,是否有任何理由?
答案 0 :(得分:14)
<强>更新强>
这将在C#6中得到支持。事实证明,这根本不可能,并且团队在不执行实施的情况下制定了如何做到这一点:)
原始回答
我强烈怀疑它是相同的reasoning that prevents yield return
from being used in a catch block。
特别是:
首先,我们仍然存在这样的问题:“转到”尝试保护区域的处理程序中间是非法的。进入catch块的唯一方法是通过捕获异常的“非本地goto”。因此,一旦你从catch块中退出,下次调用MoveNext时,我们就无法返回到我们离开的catch块。
其次,抛出和捕获的异常是catch块执行的固有部分,因为它可以使用“空抛出”语法重新抛出。我们无法通过调用MoveNext来保留该状态。
将“yield”替换为“等待”,我想你会得到答案。
感觉在大多数情况下想要做起来会很奇怪,而且通常能够轻松地重写代码以等待catch
阻止 - 当然,除非你试图等待某事然后扔掉。在那种情况下,我承认会有点痛苦......