Подавить исключения первого шанса

Можно ли подавить подавления первого шанса в Visual Studio (отладчик C#) для определенных строк кода?

Я хочу использовать исключения первого шанса в отладчике, но есть около 50 исключений первого шанса, которые мне нужно пройти через каждый сеанс отладки, прежде чем я попаду в интересный код.

В настоящее время я отключаю первые случайные исключения, а затем вручную включаю их, но это хлопот и время.

2 ответа

Решение

Класс 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, которые могут быть полезны.
альтернативный текст

Это происходит потому, что вы неправильно используете исключения. Получение 50 до того, как вы перейдете к "интересному коду", не является хорошим знаком. В Visual Studio нет способа пропустить их в некотором коде, потому что он не предназначен для поощрения того, что вы делаете.

Тем не менее, я бы отключил перехват исключений первого шанса в отладчике, явно try/catch исключение, которое вы хотите поймать, и положить в Debugger.Break() когда ты поймал это.

Другие вопросы по тегам