【问题标题】:C# Can you examine an exception without catching?C# 你可以在不捕获的情况下检查异常吗?
【发布时间】:2011-05-01 06:45:23
【问题描述】:

我有一些框架/AOP 代码记录来自内部调用的方法的异常...

try {
  ..invoke inner code...
}
catch (Exception e) {
  log(e);
  throw;
}

这很好用,除了一件事......当我的团队尝试在 Studio 中调试他们的代码时,他们只看到日志代码中发生的异常(因为它被处理,然后从那里抛出)。

有什么方法可以让 Studio 忽略我的代码正在捕获/抛出异常……或者在不捕获异常的情况下检查异常?

更新: 问题是我的框架代码阻止了 real 异常的正确断点被命中。我知道 Visual Studio 中的调试器能够进行细粒度配置,我希望这里的人可以提供比“31 小时内学习 VS2010”更高层次的洞察力。我只是想同时记录内部代码中引起的异常,并在错误的位置发生中断而不打开“中断所有异常”,这将导致我的团队花费 5 分钟按下“继续”按钮每次他们启动应用程序时(但这是另一回事)。

更新 2: 这里的主要问题是如何记录异常,但让调试器不会在我的记录器中的“抛出”时停止,而是在初始异常时停止,而不会让调试器停止所有抛出的异常。

【问题讨论】:

  • 如果您记录异常,为什么要重新抛出它以进行进一步处理?
  • 尝试检查第一次机会和第二次机会异常。
  • @Shimmy:因为异常是有效的,我不希望我的应用程序继续处于无效状态。
  • @sh_kamalh 这是一个很好的线索......有没有一种机制可以让我做一些事情,比如为了第二次机会重新提升捕获的异常? (因为我是第一个抓到的?)
  • @Martinho,你至少可以找到一个与我的问题有点相关的骗子,比如1349613418613201182201504...不是这些回答。

标签: c# visual-studio exception-handling debugging


【解决方案1】:

实际上你可以让 VS 打破异常。转到调试菜单,单击异常并选中“公共语言运行时异常”复选框。现在您将在抛出异常时获得调试中断

【讨论】:

  • 感谢您的回答。我需要一个更微妙的解决方案。
  • @Josh:请更清楚地解释这个解决方案有什么问题。
  • @Brian,鉴于他来自 AOP 框架,我假设他想要一种方法来自动将一些代码附加到某些抛出的异常上。不幸的是,我只有这个解决方案。
【解决方案2】:

我已经进行了一些挖掘,1349613 中的答案让我感觉很好。我已经添加了属性:

[DebuggerNonUserCode]

到我的日志类。现在,当内部调用代码抛出异常时,调试器会忽略日志记录代码,它是 Try/Catch 块,直接进入内部异常。

【讨论】:

    【解决方案3】:

    在 VB.NET 中可以检查异常而不捕获它,并且在任何堆栈展开之前作为它的结果。虽然在抛出异常和解除堆栈之间做很多事情通常是危险的,但人们可能会捕获异常,然后在finally 块中使用它。还可以设置一个标志或其他指示符,让堆栈展开代码知道异常将在哪里被捕获。不幸的是,后一种能力的用处是有限的,因为(主要是语言强制的)代码的反模式捕获它需要做出反应的异常,但不能指望解决。例如,如果在构造函数创建了一些IDisposable 对象并将它们存储在字段中之后在构造函数中抛出异常,则构造函数必须通过清理它创建的字段来对异常做出反应,但没有希望解决情况并正常返回。如果一个构造函数可能有多个返回点,它会在语义上更清晰,可以说:

    try
    {
      ... create IDisposables
    }
    finally(Exception ex)
    {
      if (ex != null)
        this.Dispose();
    }
    

    不用说

    try
    {
      ... create IDisposables
    }
    catch(Exception ex)
    {
      this.Dispose();
      throw ex;
    }
    

    因为前者会避免捕获异常,所以它没有处理的期望。可以在 VB 中编写一个包装器方法,它可以接受一对委托并使用与上述 finally(Exception ex) 相同的语义来实现第二个委托,但不幸的是,C# 本身没有提供这样的工具。

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多