Подавить исключения первого шанса - PullRequest
23 голосов
/ 04 июня 2009

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

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

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

Ответы [ 2 ]

27 голосов
/ 20 октября 2010

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

0 голосов
/ 04 июня 2009

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

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

...