Библиотека пожирает мои исключения - PullRequest
1 голос
/ 02 апреля 2011

Я использую библиотеку GUI, например, такую ​​(псевдокод):

static void ProcessFrame()
{
    // ...
    if(fooWentWrong) throw new FooException();
    if(barWentWrong) throw new BarException();
    // ...
}

static void Main()
{
    GUILib.OnEveryFrame += delegate { ProcessFrame(); };

    try
    {
        GUILib.MainLoop();
    }
    catch(FooException e) // we don't handle BarException
    {
        // handle exception.
    }
}

Другими словами, GUILib использует инверсию управления - его mainloop вызывает мой делегат.

Проблемазаключается в том, что GUILib является устаревшей библиотекой, которая перехватывает любое исключение, выдаваемое обработчиками OnEveryFrame, и просто печатает его на консоли, поэтому мой обработчик FooException недоступен для FooExceptions, а для BarExceptions отладчик Visual Studio не прерывается.

Я сделал перерыв в отладчике для исключений BarException, перейдя в Отладка -> Исключения и установив флажок break в брошенном (а не просто "break on onhandled") поле для "Common Language Runtime"исключения».Это работает, но это означает, что VS теперь прерывается, когда выдается любое исключение, даже когда обработчик его поймал.Так что я не могу использовать исключения для несмертельных вещей.

Есть ли лучший способ заставить VS разбить мои исключения?Мне нужно как-то обойти нарушенное поведение библиотеки.

Кстати, библиотека qt4dotnet / Qt Jambi.

Ответы [ 3 ]

2 голосов
/ 02 апреля 2011

Вы должны проверить, есть ли у GUILib событие для необработанных исключений.

Другой подход - запуск отладчика самостоятельно:

     System.Diagnostics.Debugger.Break();

Вместо или в дополнение к исключению.

1 голос
/ 03 апреля 2011

В зависимости от интересующих вас исключений, вы, вероятно, на правильном пути, используя диалоговое окно Debug-> Exceptions, за исключением того, что вы отмечаете all исключений CLR, поэтому он перехватывает все.

Вы можете отфильтровать его лучше: щелкните значок [+] рядом с записью исключений CLR, чтобы развернуть его, и он перечислит их все по отдельности, а затем вы можете отметить только определенные - или сделать этодругим способом и отметьте основной, чтобы разрешить перехват всех исключений в отладчике, затем снимите несколько определенных (например, MyInternalNotReallyAnExceptionButJustAStatusCodeException * :-).Чтобы легко найти одно или два конкретных исключения, нажмите «Найти ...» и введите частичное имя - например, «NullR» найдет исключение NullReferenceException.

* (И да, мне не нравится идея использовать исключения дляинформация о состоянии отчета - исключения IMHO следует использовать в первую очередь для передачи отказа, который не может быть обработан на месте выброса)

0 голосов
/ 03 апреля 2011

Можно ли переместить обработку исключений в делегаты?Это может закончиться небольшим избыточным кодом, но вы должны иметь возможность преобразовать тела обработки исключений в функцию.

...