.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
相关产品推荐
相关产品推荐

