gpt4 book ai didi

c# - 在Dispose()中处理异常

转载 作者:行者123 更新时间:2023-12-03 08:27:25 26 4
gpt4 key购买 nike

我有一个UnitOfWork类,它根据块中的错误来提交或回滚事务。

class UnitOfWork: IDispose
{
public void Dispose()
{
if (Marshal.GetExceptionCode() == 0
|| Marshal.GetExceptionPointers() == IntPtr.Zero)
{
// Commit
}
else
{
// Rollback
}
}
}
}

此类以以下方式使用:
try
{
using (var uow = new UnitOfWork())
{
// Do something here that causes an exception
}
}
catch
{
using (var uow = new UnitOfWork())
{
// Log exception
}
}

我看完这篇文章:
Detecting a Dispose() from an exception inside using block

在上述问题中,史蒂文(答复的人之一)提到,如果我在Dispose()中检测到“try”部分中“using”块的异常,则无法在“catch”中创建另一个UnitOfWork类。阻止错误并将错误记录到数据库中(因为Dispose()中的“Marshal”代码将继续表示存在异常),这意味着ExceptionCode和ExceptionPointers将从try块到catch块“ float ”(?)。

但是,就我而言,这可以正常工作-即。如果“try”部分的“using(var uow = new UOW)”块中存在异常,则它会正确捕获该异常,然后在catch块中通过“if”条件,从而导致提交并允许我记录异常。

归结为我对Marshal.GetExceptionPointers()的工作方式不完全了解。有人可以确认我的使用模式是否正确运行(到目前为止,所有测试似乎都表明它可以正常运行),以及Marshal.GetExceptionPointers()到底在做什么?

最佳答案

IDisposable.Dispose旨在释放资源,将提交/回退操作放入其中是一个坏主意。调用方应该知道如何处理异常以及如何回滚。

using (var unitOfWork = new UnitOfWork())
{
try
{
Prepare();
Step1();
Step2();
unitOfWork.Commit();
}
catch(PrepareException e)
{
//no necessary to rollback, just log it
}
catch(FirstStepException e1)
{
//rollback step1
}
catch(SecondStepException e2)
{
//rollback step1 and step2
}
}

关于c# - 在Dispose()中处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37409677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com