【问题标题】:How to prevent break on specific exception if it's handled如果处理特定异常,如何防止中断
【发布时间】:2013-11-12 12:04:54
【问题描述】:

通常我希望调试器在 ArgumentOutOfRangeException 上中断。

但在我的try catch(ArgumentOutOfRangeException) 中,该异常已被处理,因此我希望调试器不会中断。

我尝试了DebuggerStepThrough 属性,但它仍然中断。

【问题讨论】:

  • 去掉try catch,调试器会在右行中断
  • @ErikKronberg 调试器在右行中断,我希望它不会中断。
  • 这个问题有什么问题,以至于每个人都明白我想要的相反?
  • 因为你的问题的标题。 @MrFox NB。 +1 你改变了它。
  • @MrFox 我完全理解您的要求。也许你没有理解答案?

标签: c# exception


【解决方案1】:

您应该检查您的 Visual Studio 是否设置为中断所有异常

On the Debug menu, click Exceptions.

In the Exceptions dialog box, select Thrown for an entire category of exceptions,
for example, Common Language Runtime Exceptions.

Microsoft Visual Studio Help

【讨论】:

  • 调试器已经中断了异常,我的问题是在这种特定情况下它不应该。
【解决方案2】:

您可以通过将调试器设置为中断用户未处理的异常来做到这一点。

转到Debug -> Exceptions,Common Language Runtime Exceptions,取消勾选(取消选中)Thrown 框。当然,您可以通过深入研究该列表来非常精确地了解您想要突破的内容。请注意,此设置在整个解决方案中生效,您不能为每个类或方法设置它。如果您确实希望每个方法更具选择性,请考虑使用编译指令在调试期间不包含该位代码。

至于DebuggerStepThrough属性,就是防止断点断,与异常断无关。

【讨论】:

  • 我知道这个选项,请注意短语“通常”我希望调试器在此处中断。但在这种特定情况下,我希望它不会中断。
  • @MrFox 这应该对你有用 - 只有当异常 没有 被处理时它才会中断,在你的情况下是这样。否则,您应该求助于使用编译指令。就像我说的,这会影响整个解决方案,你不能对它进行超级选择性。
  • 好吧,我现在看到“用户未处理”框仍然处于选中状态,所以通常它应该会在这个异常上中断。
【解决方案3】:

有办法。首先禁用不属于您的调试代码。转到工具 > 选项 > 调试 > 常规 > 选择“仅启用我的代码(仅限托管)”。现在用DebuggerNonUserCodeAttribute 告诉调试器这个函数不是你代码的一部分:

    [System.Diagnostics.DebuggerNonUserCode()]
    private void FunctionThatCatchesThrownException()
    {
        try
        {
            throw new ArgumentOutOfRangeException();
        }
        catch (ArgumentOutOfRangeException ex)
        {
            //...
        }
    }

如果异常(不是ArgumentOutOfRangeException)从函数中出来,调试器会照常捕获它,但拦截的位置将是调用函数的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多