【问题标题】:Determine if code called from an exception handler (using statement)?确定是否从异常处理程序调用代码(使用语句)?
【发布时间】:2011-03-23 00:39:04
【问题描述】:

我想做一些有点傻的事情。在我的对象的Dispose() 方法中,我想打印对象的调试跟踪,告诉我在它还活着时发生的所有事件。

但是由于这需要时间和金钱,我只想在 Dispose() 因为抛出异常而被调用时才这样做。

所以我想做

if (exceptionIsCurrentlyRaised) PrintDebugStuff();

.NET 是否有这样一个我可以查询的 exceptionIsCurrentlyRaised 属性?

【问题讨论】:

标签: .net exception using finally


【解决方案1】:

我不知道是否存在这样的东西,因为我从未见过它。但听起来你可以只创建一个具有单个 bool 属性的接口。然后当你在 catch 语句中但在调用 dispose 方法之前设置标志。

我猜这不可能是这么简单的解决方案,但我想我会开始一些想法。

编辑:好的,我还发现了这篇有类似问题的 SO 文章:Determine if executing in finally block due to exception being thrown

【讨论】:

    【解决方案2】:

    有趣的问题,但我怀疑这是可能的 - 至少在没有使用调试或分析 API 进行一些重大黑客攻击的情况下并非如此。

    即使您能够调用一些调试 API,可以让您访问 catch 块内的当前异常,我认为您无法在 finally 块内获得异常(这是您的 @ 987654324@ 方法将被执行)。到那时异常可能已经被处理了,所以就运行时而言,没有异常。

    我可以查看是否这样做的唯一方法是注册以收到 all 异常的通知,因为您的对象已构建,并从那里尝试确定是否捕获了异常。这个答案可能会有所帮助:.NET - First chance exception listener for intensive debugging?

    【讨论】:

    • 如果异常被处理并且没有被重新抛出,那么在'finally'块运行时确实不会有异常。另一方面,一个常见的场景是 finally 块在异常被抛出到外部范围时运行。如果 finally 块尝试执行事务回滚之类的操作并且它失败了,它应该抛出一个回滚失败异常,并将挂起的异常作为 InnerException。不幸的是,没有干净的方法可以做到这一点。
    【解决方案3】:

    实际上,这类似于 Visual Studio 2010 的“IntelliTrace”功能,它可以记录调试会话期间您处于断点时发生的情况。

    【讨论】:

    • 一个很好的观察。是否可以在不使用 VS 的情况下使用 Intellitrace?
    • 我真的不知道。我还没有进入。
    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多