Visual Studio C# - 不要中断此行的任何异常

Visual Studio C# - Don't break for any exception at this line

提问人:Carl Schmidt 提问时间:3/4/2023 最后编辑:Carl Schmidt 更新时间:3/8/2023 访问量:410

问:

我的代码经常抛出.在这种特定情况下,异常实际上是可以的,我不希望调试器在抛出时中断。但是,我不能禁用所有中断,因为这只是一个坏主意。InvalidOperationExceptionInvalidOperationException

据推测,or 属性是我需要的,但异常冒泡并忽略该块 - 调试器无论如何都会中断。DebuggerStepThroughDebuggerHiddentry

internal class Program
{
    static void Main(string[] args)
    {
        // The debugger breaks at this line.
        // Ideally it should continue execution.
        var x = TestFunc();
    }

    [System.Diagnostics.DebuggerHidden]
    private static bool TestFunc()
    {
        try
        {
            // The actual code is third-party; I can't control the exception.
            throw new InvalidOperationException();
        }
        catch (InvalidOperationException)
        {
            return false;
        }
        catch
        {
            throw;
        }
    }
}

相关问题:

如何不破坏异常?(这不起作用,因为无法确定异常的来源。堆栈跟踪仅指向第三方代码,而不是我的调用代码。

当调试器被抛出和捕获时,不要在该异常处停止调试器(这会导致上述冒泡和规避。

使用 VS 2022

C# Visual Studio 异常 调试

评论

4赞 Rufus L 3/4/2023
不是问题的答案,但如果您只是想忽略异常,则应将其指定为:InvalidOperationExceptioncatch (InvalidOperationException)
0赞 Rufus L 3/4/2023
您是否尝试过您链接的第一个相关问题的答案?这似乎很有希望。
0赞 Carl Schmidt 3/4/2023
@RufusL我有。遗憾的是,无法查看调用方法是否具有用于处理的属性或类似属性。该异常仅具有来自第三方代码的堆栈跟踪。System.Diagnostics.DebuggerHidden

答:

1赞 wenbingeng-MSFT 3/6/2023 #1

您需要转到“工具”>“选项”>“调试”>“常规”>选择“仅启用我的代码(仅托管)”。

然后,使用 DebuggerNonUserCodeAttribute 告知调试器该函数不是代码的一部分。

[System.Diagnostics.DebuggerNonUserCode()]
private static bool TestFunc()
{
    try
    {
        throw new InvalidOperationException();
    }
    catch (InvalidOperationException)
    {
        return false;
    }
    catch
    {
        throw;
    }
}

如果它仍然不起作用,请告诉我。

评论

0赞 Carl Schmidt 3/7/2023
这与属性具有相同的效果;Visual Studio 在调用 时中断。DebuggerHiddenTestFunc()
0赞 wenbingeng-MSFT 3/7/2023
@CarlSchmidt 嗨,您提供的示例代码和我提供给您的代码,当我使用控制台进行测试时,它不会中断。所以我的猜测是您的异常设置有问题。请按照以下步骤操作:Debug=>Windows=>Exception Settings。右键单击下面的所有选项,然后单击恢复默认值。
0赞 Carl Schmidt 3/8/2023 #2

这在 Visual Studio 中似乎是不可能的。你要么告诉它在异常时中断(调试 -> Windows ->异常设置,检查异常)或忽略它。我可以忍受单击“继续”按钮(或 F5)几次。

评论

0赞 Carl Schmidt 3/11/2023
...哼?你完全误读了我的答案。答案很简单,我想要的东西目前是不可能的。是的,这些评论帮助我得出了这个结论,但不,这个结论不在任何人的评论中。这就是我做出答案的原因。祸兮福所倚,因为我把它说得很清楚,让每个人都看到。