【发布时间】:2016-09-21 10:29:21
【问题描述】:
我有一个 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
在上述问题中,Steven(其中一位回答者)提到,如果我在 Dispose() 中检测到“try”部分的“using”块的异常,我无法在“catch”块并将错误记录到数据库(因为 Dispose() 中的“Marshal”代码将继续说存在异常),这意味着 ExceptionCode 和 ExceptionPointers 将从 try 块“浮动”(?)到 catch块。
但是,就我而言,这可以正常工作 - 即。如果在“try”部分的“using (var uow = new UOW)”块中有异常,它会正确捕获异常,然后在 catch 块中,“if”条件通过,导致提交发生并允许我来记录异常。
归结为我对 Marshal.GetExceptionPointers() 的工作原理不完全了解。有人可以确认我的使用模式是否可以正常工作(到目前为止,所有测试似乎都表明它可以正常工作)以及 Marshal.GetExceptionPointers() 到底在做什么?
【问题讨论】:
标签: c# error-handling marshalling dispose