14

假设我有一个异步方法:

public async Task Do()
{
    await Task.Delay(1000);
}

另一种方法是尝试在块Do内调用方法catch

public async Task DoMore()
{
    try
    {
    }
    catch (Exception)
    {
        await Do(); //compiled error.
    }
}

但是这种方式,编译器不允许使用awaitinside catch,幕后有什么原因我们不能那样使用它吗?

4

1 回答 1

14

更新

这将在 C# 6 中得到支持。事实证明,这从根本上来说并非不可能,并且团队想出了如何做到这一点而不会在实现中发疯 :)

原始答案

我强烈怀疑这与阻止yield return在 catch 块中使用的原因相同。

尤其:

首先,我们仍然有一个问题,即“转到”到受 try-protected 区域的处理程序中间是非法的。进入 catch 块的唯一方法是通过捕获异常的“非本地 goto”。因此,一旦您退出了 catch 块,下次调用 MoveNext 时,我们将无法回到我们离开的 catch 块。

其次,抛出和捕获的异常是 catch 块执行的内在部分,因为它可以使用“空抛出”语法重新抛出。我们无法在对 MoveNext 的调用中保留该状态。

在那里将“yield”替换为“await”,我想你会有答案的。

在大多数情况下,这感觉像是一件奇怪的事情,而且您通常应该能够相当容易地重写代码以在块之后等待 - 当然,除非您试图等待某些东西然后抛出。在那种情况下,我承认会有点痛苦……catch

于 2012-10-14T06:46:32.223 回答