我不需要捕获异常,但如果有异常,我确实需要回滚:
public async IAsyncEnumerable<Item> Select()
{
var t = await con.BeginTransactionAsync(token);
try {
var batchOfItems = new List<Item>(); //Buffer, so the one connection can be used while enumerating items
using (var reader = await com.ExecuteReaderAsync(SQL, token))
{
while (await reader.ReadAsync(token))
{
var M = await Materializer(reader, token);
batchOfItems.Add(M);
}
}
foreach (var item in batchOfItems)
{
yield return item;
}
await t.CommitAsync();
}
catch
{
await t.RollbackAsync();
}
finally
{
await t.DisposeAsync();
}
}
(此代码是我正在做的简化版本,用于说明目的)
这失败并显示以下消息:
不能在带有 catch 子句的 try 块的主体中产生值
这类似于从 try/catch 块返回的 Yield,但它具有新颖的上下文:
- “IAsyncEnumerable”相对较新。
- Postgresql(答案使用内部属性)
- 这个问题有一个更好的标题,明确提到“交易”上下文。具有相同错误消息的其他上下文不会有相同的答案。
这与为什么不能在带有 catch 的 try 块中出现 yield return 不同?. 就我而言,上下文更具体:我需要 catch 块来回滚,而不是做任何其他事情。此外,如您所见,我已经知道答案并将其创建为问答组合。正如您从答案中看到的那样,该答案与为什么不能在带有 catch 的 try 块内出现 yield return 无关?