抑制首次机会异常。

25

如何在 Visual Studio(C# 调试器)中针对特定的代码行禁用第一次机会异常?

我想在调试器中使用第一次机会异常,但在进入感兴趣的代码前,每个调试会话需要处理约50个第一次机会异常。

目前,我关闭第一次机会异常,然后手动打开,但这是一个麻烦和浪费时间的过程。

2个回答

30

DebuggerNonUserCodeAttribute类

从.NET 2.0开始,如果你在方法上标记了[DebuggerNonUserCode]特性,调试器将跳过其中的一次性异常。

以下是来自MSDN链接的引用(我添加了强调):

非用户创建的代码会使得调试变得复杂。此特性抑制了这些附属类型和成员的显示,并自动执行步骤,而不是进入设计师提供的代码。

除了调试以外,该特性没有与运行时行为相关联。

但是,如果您只有一个方法包含某些行旨在包括在Visual Studio的一次性异常处理机制中,并且其他行应被排除在外,那么在这个粒度级别上可能没有解决方案。您可以将一个大方法重新分解成多个方法,并在选择的方法上使用该特性。


附加信息...

这篇文章提供了一个示例使用方法。

using System.Diagnostics;
using XL = Microsoft.Office.Interop.Excel;

public static class WorkbookExtensions
{
    [DebuggerNonUserCode]
    public static bool TryGetWorksheet(this XL.Workbook wb, string worksheetName, out XL.Worksheet retrievedWorksheet)
    {
        bool exists = false;
        retrievedWorksheet = null;

        try
        {
            retrievedWorksheet = GetWorksheet(wb, worksheetName);
            exists = retrievedWorksheet != null;
        }
        catch(COMException)
        {
            exists = false;
        }

        return exists;
    }

    [DebuggerNonUserCode]
    public static XL.Worksheet GetWorksheet(this XL.Workbook wb, string worksheetName)
    {
        return wb.Worksheets.get_Item(worksheetName) as XL.Worksheet;
    }
}

这篇文章展示了一些相关的VS项目选项,可能会很有用。
alt text


不错...我不知道这个。 - Kang Su
1
非常感谢。这使得调试实际上的意外异常变得更加容易。 - Parrhesia Joe
谢谢,这终于解决了我的问题。Skeet/Gravell的“MiscUtil”依赖于抛出异常,即使它们立即被处理,它们也总是被作为第一次机会异常捕获。将此属性应用于他们的某些类可以解决这个问题。 - Dave Cousineau
1
你应该意识到,这仍然会触发“FirstChanceExceptions”事件处理程序。你的提示只是告诉编译器不要中断你所标记的方法。这并不能解决这里所问的问题。“标识一个不属于应用程序用户代码的类型或成员。” - Latency
这在我的netcoreapp3.1中不起作用。调试器仍会在带有该属性注释的方法中断点处中断。 - asgerhallas

-2
这是因为您错误地使用了异常。在到达“有趣的代码”之前就出现50并不是一个好兆头。在某些代码中跳过它们的方法在Visual Studio中是不可能的,因为它不鼓励您所做的事情。
话虽如此,我会先关闭调试器中捕获第一次机会的异常,明确地try/catch您想要捕获的异常,并在捕获它时加入Debugger.Break()

2
这些不是我的异常。我的代码是一个现有产品的插件。现有产品会吞噬插件中的异常,因此我想使用第一次机会异常来确保我的异常都没有被吞噬,但我不想费力处理它们包装器中未处理的现有异常。 - Kang Su
3
我需要重新强调,这些是第一次机会异常,而不是第二次机会异常。 - Kang Su
1
在复杂程序中,异常情况经常发生,而这些情况都超出了开发人员的控制范围。例如,自动化在您使用元素时消失时会引发异常。每当涉及到COM或注入到另一个进程时,异常都是非常普遍的。 - Parrhesia Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接