抑制第一次机会异常

时间:2009-06-04 04:21:20

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

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

我想在调试器中使用第一次机会异常,但在我得到有趣的代码之前,我需要经历每个调试会话的大约50个第一次机会异常。

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

2 个答案:

答案 0 :(得分:27)

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项目选项 alt text

答案 1 :(得分:-2)

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

那就是说,我要做的就是关闭调试器中的第一次机会异常,明确地try/catch你要捕获的异常,并在你Debugger.Break()时放入已经抓住了它。