25

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

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

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

4

2 回答 2

28

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 项目选项。
替代文字

于 2010-10-19T21:04:08.000 回答
-2

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

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

于 2009-06-04T04:26:53.170 回答