You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 4.7工作单元迁移.NET Core 2.1:异常判断代码适配问题

在.NET Core 2.1中实现工作单元Dispose时的异常判断

我懂你之前在.NET 4.7里的做法——在Dispose过程中通过Marshal.GetExceptionPointers()和Marshal.GetExceptionCode()判断是否有未处理异常,进而决定事务回滚对吧?可惜这两个方法在.NET Core里被移除了,不过别担心,有更合适的替代方案。

推荐方案:使用Environment.HasException(.NET Core 2.1+原生支持)

从.NET Core 2.1开始,Environment类新增了HasException属性,它可以直接告诉你当前线程是否有未处理的异常正在传播,完美替代你之前的判断逻辑。

代码示例

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        // 判断当前是否存在未处理异常
        if (Environment.HasException)
        {
            // 异常发生时执行回滚
            _transaction?.Rollback();
        }
        else
        {
            // 无异常则提交事务(按需调整)
            _transaction?.Commit();
        }
        
        // 清理其他资源
        _transaction?.Dispose();
        _dbConnection?.Dispose();
    }
}

这个方案的优势

  • 精准匹配需求:Environment.HasException仅在当前线程有未处理异常(即异常正在向上抛出)时返回true,完全符合你在Dispose时判断是否需要回滚的场景。
  • 官方推荐替代:这是.NET Core团队为替代旧的Marshal异常检测方法提供的原生API,兼容性和稳定性都更有保障。
  • 逻辑保持一致:它不会捕获或处理异常,只是做判断,和你原来的代码逻辑完全对齐,不会引入额外的异常处理行为。

额外提醒

一定要确保你的工作单元实例是在using块中使用的,这样Dispose方法会在代码块结束时自动触发,不管是否发生异常,都能正确执行事务的收尾操作。

内容的提问来源于stack exchange,提问作者tbddeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:28:00