【问题标题】:Suppress first chance exceptions抑制第一次机会异常
【发布时间】:2009-06-04 04:21:20
【问题描述】:

是否可以在 Visual Studio(C# 调试器)中抑制特定代码行的首次机会抑制?

我想在调试器中使用第一次机会异常,但是在获得有趣的代码之前,我需要通过每个调试会话来处理大约 50 个第一次机会异常。

目前,我关闭第一次机会异常,然后手动打开它们,但这既麻烦又浪费时间。

【问题讨论】:

    标签: c# debugging visual-studio-2008 exception first-chance-exception


    【解决方案1】:

    DebuggerNonUserCodeAttribute 类

    从 .NET 2.0 开始,如果您使用 [DebuggerNonUserCode] 属性标记方法,调试器将跳过其中的第一次机会异常。

    引用自 MSDN 链接(强调是我的):

    成员 不是代码的一部分 用户专门创建的可以 使调试体验复杂化。 该属性禁止显示 这些附加类型和成员在 调试器窗口并自动 逐步通过,而不是进入, 设计师提供的代码。

    除了调试之外,没有与此属性相关联的运行时行为。

    但是,如果您只有一个方法,其中某些行打算包含在 Visual Studio 的第一次机会异常处理机制中,而其他行要排除在外,那么在这种粒度级别上可能没有解决方案。您始终可以将一个大方法重构为多个方法,并在选择的方法上使用该属性。


    其他信息...

    来自this article的示例用法

    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;
        }
    }
    

    The article 显示可能有用的相关 VS 项目选项。

    【讨论】:

    • 很好...我不知道这个。
    • 非常感谢。这使得调试实际意外异常变得容易得多。
    • 谢谢,这终于解决了我的问题。 Skeet/Gravell 的“MiscUtil”依赖于抛出的异常,即使它们被立即处理,它们也总是被作为第一次机会异常捕获。将此属性应用于他们的一些类解决了这个问题。
    • 您确实意识到仍然会到达“FirstChanceExceptions”事件处理程序。您的提示仅告诉编译器不要破坏您归因的方法。这并不能解决这里所问的问题。 "标识不属于应用程序用户代码的类型或成员。"
    • 这在 netcoreapp3.1 中对我不起作用。在使用该属性注释的方法中,调试器仍然会在第一次出现异常时中断。
    【解决方案2】:

    发生这种情况是因为您误用了异常。在获得“有趣的代码”之前获得 50 并不是一个好兆头。在 Visual Studio 中无法在某些代码中跳过它们,因为它的设计目的不是为了鼓励您正在做的事情。

    也就是说,我要做的是关闭在调试器中捕获第一次机会异常,明确地 try/catch 你确实想要捕获的异常,并在你捕获它时输入 Debugger.Break() .

    【讨论】:

    • 这些不是我的例外。我的代码是现有产品的插件。现有产品会吞下加载项中的异常,因此我想使用第一次机会异常来确保我的任何异常都不会被吞下,但我不想费力地处理未处理的现有异常。包装器。
    • 我应该重申,这些是第一次机会例外,而不是第二次机会例外。
    • 在许多情况下,复杂程序中都会出现异常,这一切都超出了开发人员的控制范围。例如,当您使用它们时元素消失时,自动化会引发异常。任何时候你处理 COM,或者注入另一个进程,异常都是很常见的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多