【发布时间】:2021-01-06 06:51:41
【问题描述】:
我不需要捕获异常,但是如果有异常我确实需要回滚:
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 块的主体中产生值
这类似于Yield return from a try/catch block,但它具有新颖的上下文:
- “IAsyncEnumerable”相对较新。
- Postgresql(答案使用内部属性)
- 这个问题有一个更好的标题,明确提到“交易”上下文。具有相同错误消息的其他上下文不会有相同的答案。
这与Why can't yield return appear inside a try block with a catch? 不同。就我而言,上下文更具体:我需要 catch 块来回滚,而不是做任何其他事情。此外,如您所见,我已经知道答案并将其创建为问答组合。从答案中可以看出,该答案与Why can't yield return appear inside a try block with a catch?
无关【问题讨论】:
-
我的问题刚刚被关闭,因为没有列出我需要联系的版主。如果您查看我的评论,我已经说明了这与stackoverflow.com/questions/346365/… 有何不同。尽管如此,它在没有说明为什么在 cmets 中被关闭的情况下被关闭。这只是不体谅和不友善。
-
@CamiloTerevinto duplicate 是关于为什么。这个问题是关于如何。这是一个相关但不同的问题。
-
@CamiloTerevinto 我希望我能说服你我是一个真正勤奋的人,他会彻底检查其他类似的问题。看来您在结束我的问题时已经过激了。我将其创建为自学问答组合 - 为了他人的利益回答我自己的问题。我的完全不同,请看我的回答;这不适用于其他类似的问题,其中异常对象将用于
Console.WriteLine(e.Message);。 -
@CamiloTerevinto 使用布尔锁存器不适用于其他问题。如果可行,我会在那里回答。具有布尔锁存器不会捕获错误日志记录 (Console.WriteLine) 的异常。
-
@CamiloTerevinto 很好的发现,您链接到的问题标题太宽泛,被标记为重复。它引领的地方更广泛。这有点乱。这种重复标记没有帮助。
标签: c# postgresql transactions ado.net iasyncenumerable