views:

335

answers:

3

Is it possible to supress 1st chance supressions in Visual Studio (C# debugger) for specific lines of code? I want to use 1st chance exceptions in the debugger, but there are about 50 1st chance exceptions I need to go through every debug session before I get to the interesting code.

Currently, I turn off 1st chance exceptions and then manually turn them on, but that's a hassle and a time sink.

Thanks!

+1  A: 

This is happening because you are mis-using exceptions. Getting 50 before you get to the "interesting code" is not a good sign. There is no way in Visual Studio to skip them in some code, because it's not designed to encourage what you are doing.

That said, what I'd do would be to turn off catching first-chance exceptions in the debugger, explicitly try/catch the exception you do want to catch, and put in a Debugger.Break() when you've caught it.

mquander
These are not my exceptions. My code is an add-in to an existing product. The existing product swallows exceptions from add-ins so I'd like to use 1st chance exceptions to ensure that none of my exceptions are getting swallowed, yet I don't want to slog through the existing exceptions that aren't being handled in their wrapper.
Kang Su
And I should restate, these are 1st chance exceptions, not 2nd chance exceptions.
Kang Su
+2  A: 

DebuggerNonUserCodeAttribute Class

Apart from marking specific lines of code, if you mark an method with the [DebuggerNonUserCode] attribute, the debugger will skip first chance exceptions in it.

Quote from MSDN link:

members that are not part of the code specifically created by the user can complicate the debugging experience. This attribute suppresses the display of these adjunct types and members in the debugger window and automatically steps through, rather than into, designer provided code.

There is no runtime behaviour apart from debugging, associated with this attribute.

However if you have just one method with certain lines intended for inclusion in Visual Studio's first chance exception handling mechanism, and other lines to be excluded, there's likely not a solution at this level of granularity. You can always refactor a large method into multiple methods and use the attribute on select ones.


Additional Info...

Example usage from 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 shows related VS project options that might be useful.
alt text

John K
Nice... I didn't know about this.
Kang Su
A: 

If the 50 exceptions you want to skip are of a different kind than the one you are curious about, try going into the Debug menu, 'exceptions' dialog, and changing their behaviour. Didn't try it but it might be a lead.

FastAl