try/catch 块的收益回报
- 作者: 鹰兄
- 来源: 51数据库
- 2022-10-20
问题描述
正如 Eric Lippert 在 这篇文章,try/catch 子句中不允许yield return.
As Eric Lippert described in this article, yield return is not allowed within try/catch clauses.
有没有一种很好的方法可以让我得到这样的东西,而不必手动编写自己的IEnumerator:
Is there a nice way I could get something like this, without having to write my own IEnumerator by hand:
public IEnumerable<Data> GetData()
{
var transaction = Session.BeginTransaction());
try
{
IQuery q = CreateQuery(session);
foreach (var result in q.Enumerable())
yield return ProjectResult(result); // <-- doesn't work
session.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
throw;
}
finally
{
transaction.Dispose();
}
}
推荐答案
我只是像这样更改事务处理逻辑:
I'd just change the transaction-handling logic like this:
public IEnumerable<Data> GetData()
{
var transaction = Session.BeginTransaction();
bool rollback = true;
try
{
IQuery q = CreateQuery(session);
foreach (var result in q.Enumerable())
{
yield return ProjectResult(result);
}
rollback = false;
session.Commit();
}
finally
{
if (rollback)
{
transaction.Rollback();
}
transaction.Dispose();
}
}
或者,如果您的事务支持除非已提交,否则处理意味着回滚"的想法:
Or if your transaction supports the idea of "dispose means rollback unless it's commited":
public IEnumerable<Data> GetData()
{
using (var transaction = Session.BeginTransaction();
{
IQuery q = CreateQuery(session);
foreach (var result in q.Enumerable())
{
yield return ProjectResult(result);
}
// Commits the tnrasaction, so disposing it won't roll it back.
session.Commit();
}
}
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
