You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在异常时静默终止IAsyncEnumerable异步迭代器?

如何在异常发生时静默终止IAsyncEnumerable迭代器?

你可以通过手动控制异步枚举器的方式重写代码,避开yield return不能放在try/catch块内的限制,同时保留编译器生成迭代器的特性。

解决方案代码

public async IAsyncEnumerable<T2> Map<T1, T2>(IAsyncEnumerable<T1> source, Func<T1, T2> map)
{
    using var enumerator = source.GetAsyncEnumerator();
    bool hasNext;
    try
    {
        hasNext = await enumerator.MoveNextAsync();
    }
    catch
    {
        yield break;
    }

    while (hasNext)
    {
        yield return map(enumerator.Current);
        try
        {
            hasNext = await enumerator.MoveNextAsync();
        }
        catch
        {
            yield break;
        }
    }
}

原理说明

  • 手动获取IAsyncEnumerator,将MoveNextAsync()的调用单独放在try/catch块中,而yield return放在块外,符合编译器的语法限制。
  • 每次调用MoveNextAsync()时如果抛出异常(包括取消令牌触发的TaskCancelledException),直接执行yield break静默终止迭代。
  • 全程依赖编译器生成的迭代器逻辑,没有手动实现完整的迭代器模式。

内容的提问来源于stack exchange,提问作者Impworks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:43:13