Подтвердить что ты не робот

Почему исключение .NET не попало в блок try/catch?

Я работаю над проектом, используя библиотеку парсеров ANTLR для С#. Я построил грамматику, чтобы разобрать текст, и он работает хорошо. Однако, когда парсер сталкивается с незаконным или неожиданным токеном, он выдает одно из многих исключений. Проблема в том, что в некоторых случаях (не все) мой блок try/catch не поймает его и вместо этого прекратит выполнение как необработанное исключение.

Проблема для меня в том, что я не могу воспроизвести эту проблему нигде, кроме моего полного кода. Стек вызовов показывает, что исключение определенно встречается в моем блоке try/catch (Exception). Единственное, что я могу придумать, это то, что между моим кодом и кодом, генерирующим исключение, есть несколько вызовов сборки ANTLR, и в этой библиотеке нет отладки, поэтому я не могу пройти через нее. Интересно, запрещают ли отказоустойчивые сборки блокировать исключение? Стек вызова выглядит следующим образом; внешние вызовы сборки находятся в Antlr.Runtime:

    Expl.Itinerary.dll!TimeDefLexer.mTokens() Line 1213 C#
    Antlr3.Runtime.dll!Antlr.Runtime.Lexer.NextToken() + 0xfc bytes 
    Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.FillBuffer() + 0x22c bytes   
    Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.LT(int k = 1) + 0x68 bytes
    Expl.Itinerary.dll!TimeDefParser.prog() Line 109 + 0x17 bytes   C#
    Expl.Itinerary.dll!Expl.Itinerary.TDLParser.Parse(string Text = "", Expl.Itinerary.IItinerary Itinerary = {Expl.Itinerary.MemoryItinerary}) Line 17 + 0xa bytes C#

Фрагмент кода с самого нижнего вызова в Parse() выглядит так:

     try {
        // Execution stopped at parser.prog()
        TimeDefParser.prog_return prog_ret = parser.prog();
        return prog_ret == null ? null : prog_ret.value;
     }
     catch (Exception ex) {
        throw new ParserException(ex.Message, ex);
     }

Для меня предложение catch (Exception) должно было занять какое-либо исключение. Есть ли причина, почему это не так?

Обновление: Я проследил через внешнюю сборку с Reflector и не обнаружил никаких доказательств пронизывания. Похоже, что сборка представляет собой обычный служебный класс для ANTLR сгенерированного кода. Исключением является метод TimeDefLexer.mTokens(), а его тип - NoViableAltException, который происходит из RecognitionException → Exception. Это исключение выдается, когда лексер не может понять следующий токен в потоке; другими словами, недопустимый ввод. Это исключение SUPPOSED должно произойти, однако оно должно быть захвачено моим блоком try/catch.

Кроме того, реорганизация ParserException действительно не имеет отношения к этой ситуации. Это слой абстракции, который принимает какое-либо исключение во время разбора и конвертируется в мое собственное исключение ParserException. Проблема обработки исключений, с которой я столкнулась, никогда не достигает этой строки кода. Фактически, я прокомментировал часть "throw new ParserException" и получил тот же результат.

Еще одна вещь, я изменил исходный блок try/catch, о котором идет речь, вместо этого поймать NoViableAltException, устраняя любую путаницу наследования. Я все равно получил тот же результат.

Кто-то однажды предположил, что иногда VS является overactive при перехвате обработанных исключений в режиме отладки, но эта проблема также возникает в режиме выпуска.

Человек, я все еще в тупике! Раньше я не упоминал об этом, но я запускаю VS 2008, и весь мой код - 3.5. Внешняя сборка - 2.0. Кроме того, некоторые из моих подклассов кода класса в сборке 2.0. Может ли возникнуть ошибка в версии?

Обновление 2:. Я смог устранить конфликт версии .NET, портируя соответствующие части моего .NET 3.5-кода в проект .NET 2.0 и реплицируя тот же сценарий. Я смог реплицировать одно и то же необработанное исключение при постоянной работе в .NET 2.0.

Я узнал, что ANTLR недавно выпустила 3.1. Итак, я обновился с 3.0.1 и повторил попытку. Оказывается, сгенерированный код немного реорганизуется, но в моих тестовых случаях происходит одно и то же необработанное исключение.

Обновление 3: Я воспроизвел этот сценарий в упрощенном проекте VS 2008 . Не стесняйтесь загружать и проверять проект самостоятельно. Я применил все замечательные предложения, но пока не смог преодолеть это препятствие.

Если вы найдете обходной путь, пожалуйста, поделитесь своими результатами. Еще раз спасибо!


Спасибо, но VS 2008 автоматически разбивается на необработанные исключения. Кроме того, у меня нет диалога Debug- > Exceptions. Выпущенное NoViableAltException полностью предназначено и предназначено для обнаружения кода пользователя. Поскольку он не пойман как ожидалось, выполнение программы неожиданно приостанавливается как необработанное исключение.

Исключенное исключение выводится из Exception и нет многопоточности, идущей с ANTLR.

4b9b3361

Ответ 1

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

В третьем случае из вашего репродукции я считаю, что вы получаете следующее сообщение: "NoViableAltException был необработанным кодом пользователя" и столбец, который выглядит следующим образом:

         [External Code]    
    >   TestAntlr-3.1.exe!TimeDefLexer.mTokens() Line 852 + 0xe bytes   C#
        [External Code] 
        TestAntlr-3.1.exe!TimeDefParser.prog() Line 141 + 0x14 bytes    C#
        TestAntlr-3.1.exe!TestAntlr_3._1.Program.ParseTest(string Text = "foobar;") Line 49 + 0x9 bytes C#
        TestAntlr-3.1.exe!TestAntlr_3._1.Program.Main(string[] args = {string[0x00000000]}) Line 30 + 0xb bytes C#
        [External Code] 

Если вы щелкните правой кнопкой мыши в окне вызова и запустите включить внешний код, вы увидите следующее:

        Antlr3.Runtime.dll!Antlr.Runtime.DFA.NoViableAlt(int s = 0x00000000, Antlr.Runtime.IIntStream input = {Antlr.Runtime.ANTLRStringStream}) + 0x80 bytes   
        Antlr3.Runtime.dll!Antlr.Runtime.DFA.Predict(Antlr.Runtime.IIntStream input = {Antlr.Runtime.ANTLRStringStream}) + 0x21e bytes  
    >   TestAntlr-3.1.exe!TimeDefLexer.mTokens() Line 852 + 0xe bytes   C#
        Antlr3.Runtime.dll!Antlr.Runtime.Lexer.NextToken() + 0xc4 bytes 
        Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.FillBuffer() + 0x147 bytes   
        Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.LT(int k = 0x00000001) + 0x2d bytes  
        TestAntlr-3.1.exe!TimeDefParser.prog() Line 141 + 0x14 bytes    C#
        TestAntlr-3.1.exe!TestAntlr_3._1.Program.ParseTest(string Text = "foobar;") Line 49 + 0x9 bytes C#
        TestAntlr-3.1.exe!TestAntlr_3._1.Program.Main(string[] args = {string[0x00000000]}) Line 30 + 0xb bytes C#
        [Native to Managed Transition]  
        [Managed to Native Transition]  
        mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x39 bytes    
        Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x2b bytes  
        mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x3b bytes   
        mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x81 bytes    
        mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x40 bytes

Сообщение отладчика сообщает вам, что исключение, происходящее вне вашего кода (из NoViableAlt), проходит через ваш код в TestAntlr-3.1.exe! TimeDefLexer.mTokens() без обработки.

Формулировка сбивает с толку, но это не означает, что исключение является неотображенным. Отладчик дает вам знать, что код, которым вы владеете mTokens(), должен быть надежным против того, чтобы это исключение было передано через него.

Вещи, чтобы посмотреть, как это выглядит для тех, кто не воспроизводил проблему:

  • Перейдите в раздел "Инструменты/Параметры/Отладка и выключить "Включить только мой код (Только для управляемых) "или.
  • Перейдите в раздел "Отладчик/Исключения" и отключите "Пользователь-необработанный" для Исключения для обычного языка Runtime.

Ответ 2

Независимо от того, была ли сборка скомпилирована как сборка релиза, исключение обязательно должно "пузыриться" до вызывающего, нет причины, по которой сборка, не скомпилированная в режиме отладки, должна иметь какое-либо влияние на нее.

Я согласен с тем, что Daniel предлагает, чтобы исключение происходило в отдельном потоке - попробуйте подключить событие исключения потока в Application.ThreadException. Это должно возникать при возникновении любого необработанного исключения. Вы можете настроить свой код таким образом: -

using System.Threading;

...

void Application_ThreadException(object sender, ThreadExceptionEventArgs e) {
  throw new ParserException(e.Exception.Message, e.Exception);
}    

 ...

 var exceptionHandler = 
    new ThreadExceptionEventHandler(Application_ThreadException);
 Application.ThreadException += exceptionHandler;
 try {
    // Execution stopped at parser.prog()
    TimeDefParser.prog_return prog_ret = parser.prog();
    return prog_ret == null ? null : prog_ret.value;
 }
 catch (Exception ex) {
    throw new ParserException(ex.Message, ex);
 }
 finally {
    Application.ThreadException -= exceptionHandler;
 }

Ответ 3

Используете ли вы .Net 1.0 или 1.1? Если это так, catch (Exception ex) не будет перехватывать исключения из неуправляемого кода. Вместо этого вам нужно будет использовать catch {}. См. Эту статью для получения дополнительной информации:

http://www.netfxharmonics.com/2005/10/net-20-trycatch-and-trycatchexception/

Ответ 4

Я могу рассказать вам, что здесь происходит...

Visual Studio ломается, потому что думает, что исключение необработанно. Что означает необработанное? Ну, в Visual Studio есть параметр в Инструментах... Параметры... Отладка... Общие... "Включить только мой код (только управляемый)". Если это проверено и если исключение распространяется вне вашего кода и выходит в кадр стека, связанный с вызовом метода, который существует в сборке, которая является "НЕ ВАШИМ КОДОМ" (например, Antlr), это считается "необработанным". По этой причине я отключил функцию "Включить только мой код". Но, если вы спросите меня, это хромает... допустим, вы это делаете:

ExternalClassNotMyCode c = new ExternalClassNotMyCode();
try {
    c.doSomething( () => { throw new Exception(); } );
}
catch ( Exception ex ) {}

doSomething вызывает вашу анонимную функцию, и эта функция выдает исключение...

Обратите внимание, что это "необработанное исключение" в соответствии с Visual Studio, если включено "Включить только мой код". Кроме того, обратите внимание, что он останавливается, как если бы это была точка останова в режиме отладки, но в среде без отладки или производства код совершенно корректный и работает как ожидалось. Кроме того, если вы просто "продолжаете" в отладчике, приложение продолжает веселиться (это не останавливает поток). Он считается "необработанным", поскольку исключение распространяется через стек стека, который НЕ находится в вашем коде (т.е. Во внешней библиотеке). Если вы спросите меня, это отвратительно. Измените это поведение по умолчанию Microsoft. Это вполне допустимый случай использования Исключения для управления логикой программы. Иногда вы не можете изменить стороннюю библиотеку, чтобы вести себя по-другому, и это очень полезный способ выполнения многих задач.

Возьмите MyBatis, например, вы можете использовать эту технику, чтобы остановить обработку записей, которые собираются при вызове SqlMapper.QueryWithRowDelegate.

Ответ 5

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

Ответ 6

Лично я не уверен в теории нитей.

В один раз, когда я видел это раньше, я работал с библиотекой, которая также определяла Exception и используемые вами слова, что фактический Catch имел в виду другой тип "Исключение" (если он был полностью квалифицирован было исключение Company.Lib.Exception, но это было не из-за использования), поэтому, когда дело дошло до обнаружения обычного исключения, которое было выбрано (какое-то исключение аргумента, если я правильно помню), он просто не поймал бы его, потому что тип didn ' t.

Итак, в общем, существует ли другой тип исключения в другом пространстве имен, который используется в этом классе?

EDIT: быстрый способ проверить это - убедитесь, что в предложении catch вы полностью квалифицируете тип исключения как "System.Exception" и даете ему завихрение!

EDIT2: ОК. Я пробовал код и упускаю поражение на данный момент. Я должен буду поглядеть на него утром, если никто не придумает решение.

Ответ 7

Я с @Shaun Austin - попробуйте обернуть попытку с полным именем

catch (System.Exception)

и посмотрим, поможет ли эта помощь. Докторы ANTLR говорят, что следует исключать Исключения?

Ответ 8

Для меня предложение catch (Exception) должно было занять какое-либо исключение. Есть ли причина, почему это не так?

Единственная возможность, о которой я могу думать, это то, что что-то еще улавливает ее перед вами и обрабатывает ее таким образом, что это неперехваченное исключение (например, выход из процесса).

мой блок try/catch не поймает его и вместо этого прекратит выполнение как необработанное исключение.

Вам нужно найти, что вызывает процесс выхода. Это может быть нечто иное, чем необработанное исключение. Вы можете попробовать использовать собственный отладчик с точкой останова, установленной на "{, kernel32.dll} ExitProcess". Затем используйте SOS, чтобы определить, какой управляемый код вызывает процесс выхода.

Ответ 9

Хмм, я не понимаю проблему. Я загрузил и попробовал ваш пример файла решения.

В TimeDefLexer.cs, строка 852 исключается исключение, которое впоследствии обрабатывается блоком catch в Program.cs, который просто говорит об исключении Handled.

Если я раскомментирую блок catch над ним, он будет вместо этого ввести этот блок.

Что здесь может быть проблемой?

Как сказал Кибби, Visual Studio остановится на исключениях, но если вы попросите его продолжить, исключение попадет в ваш код.

Ответ 10

Я загрузил образец проекта VS2008, и здесь тоже немного. Однако я смог преодолеть исключения, хотя, вероятно, не так, как будет работать, для вас это будет отлично. Но вот что я нашел:

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

Оттуда я добавил пару фиктивных классов в основной файл program.cs:

class MyNoViableAltException : Exception
{
    public MyNoViableAltException()
    {
    }
    public MyNoViableAltException(string grammarDecisionDescription, int decisionNumber, int stateNumber, Antlr.Runtime.IIntStream input)
    {
    }
}
class MyEarlyExitException : Exception
{
    public MyEarlyExitException()
    {
    }

    public MyEarlyExitException(int decisionNumber, Antlr.Runtime.IIntStream input)
    {
    }
}

а затем добавили строки использования в TimeDefParser.cs и TimeDefLexer.cs:

using NoViableAltException = MyNoViableAltException;
using EarlyExitException = NoViableAltException; 

С этим исключения будут пузыриться в поддельные классы исключений и могут обрабатываться там, но в методе mTokens в TimeDefLexer.cs все еще есть исключение. Обнаружение исключения в том, что в попытке поймать в этом классе исключение:

            try
            {
                alt4 = dfa4.Predict(input);
            }
            catch
            {
            }

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

Ответ 11

Я загрузил ваш код, и все работает так, как ожидалось.

Отладчик Visual Studio правильно перехватывает все исключения. Блокировка блоков работает, как ожидалось.

Я запускаю Windows 2003 сервер SP2, VS2008 Team Suite (9.0.30729.1 SP)

Я попытался скомпилировать проект для .NET 2.0, 3.0 и 3.5

@Steve Steiner, варианты отладчика, которые вы упомянули, не имеют никакого отношения к этому поведению.

Я попытался сыграть с этими параметрами без видимых эффектов - блоки захвата смогли перехватить все исключения.

Ответ 12

Стив Стейнер прав, что исключение происходит в библиотеке antlr, проходя через метод mTokens() и попадая в библиотеку antlr. Проблема в том, что этот метод автоматически генерируется antlr. Поэтому любые изменения для обработки исключения в mTokens() будут перезаписаны, когда вы сгенерируете классы parser/lexer.

По умолчанию antlr будет регистрировать ошибки и попытаться восстановить синтаксический анализ. Вы можете переопределить это так, чтобы parser.prog() выдавал исключение всякий раз, когда возникает ошибка. Из вашего примера кода я думаю, что это поведение, которое вы ожидали.

Добавьте этот код в свой грамматический (.g) файл. Вам также необходимо отключить "Включить только мой код" в меню отладки.

@members {

    public override Object RecoverFromMismatchedSet(IIntStream input,RecognitionException e,    BitSet follow)  
    {
        throw e;
    }
}

@rulecatch {
    catch (RecognitionException e) 
    {
        throw e;
    }
}

Это моя попытка версии С# примера, приведенного в главе "Выход из распознавателя при первой ошибке" в книге "Окончательный справочник ANTLR".

Надеюсь, это то, что вы искали.

Ответ 13

Вы можете настроить VS.Net на разрыв, как только произойдет какое-либо исключение. Просто запустите проект в режиме отладки, и он прекратится, как только будет создано исключение. Тогда вы должны иметь лучшее представление о том, почему его не поймают.

Кроме того, вы можете поместить некоторый код в уловить все необработанные исключения. Прочтите ссылку для получения дополнительной информации, но основными являются эти две строки.

Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionHandler);

 // Catch all unhandled exceptions in all threads.
 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);

Ответ 14

О, и в отношении того, что сказал Кибби; если вы выберете "Отладка | Исключения в VS" и просто щелкните все поля в столбце "брошенные", он должен выбрать все AFAIK как "исключение из первого шанса", то есть VS укажет, когда исключение будет обрабатываться всем остальным и перерыв в соответствующем коде. Это должно помочь в отладке.

Ответ 15

Самый лучший вариант: настройка Visual Studio на разрыв всех необработанных исключений (диалог "Отладка → Исключения", установите флажок "Исключения общего времени выполнения языка" и, возможно, другие). Затем запустите программу в режиме отладки. Когда код анализатора ANTLR генерирует исключение, он должен быть улавливан Visual Studio и позволяет вам увидеть, где он происходит, тип исключения и т.д.

Основываясь на описании, блок catch выглядит правильно, поэтому может произойти одна из нескольких вещей:

  • анализатор фактически не бросает исключение
  • анализатор в конечном счете бросает то, что не происходит из System.Exception
  • есть исключение, которое бросается на другой поток, который не обрабатывается

Похоже, что вы, возможно, исключили проблему №3.

Ответ 16

Я проследил через внешнюю сборку с Reflector и не нашел никаких доказательств пронизывания.

Вы не можете найти ни одной нити, это не означает, что нет нити

.NET имеет "пул потоков", который представляет собой набор "запасных" потоков, которые сидят в основном без дела. Некоторые методы заставляют вещи запускаться в одном из потоков пулов потоков, чтобы они не блокировали основное приложение.

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

Действительно, вам нужно сделать то, что предлагает кибби.

Ответ 17

Вы пытались напечатать (Console.WriteLine()) исключение в предложении catch, а не использовать визуальную студию и запустить приложение на консоли?

Ответ 18

Я считаю, что Стив Штайнер прав. При исследовании предложений Стива я встретил этот поток, говорящий о опции "Включить только мой код" в "Инструменты | Параметры | Отладчик | Общие". Предполагается, что отладчик будет ломаться в определенных условиях, когда не-пользовательский код либо бросает, либо обрабатывает исключение. Я не совсем уверен, почему это имеет значение, или почему отладчик конкретно говорит, что исключение было необработанным, когда оно действительно было.

Я смог устранить ложные перерывы, отключив опцию "Включить только мой код". Это также изменяет диалог "Отладка | Исключения", удаляя столбец "Пользовательский", поскольку он больше не применяется. Или вы можете просто снять флажок "Пользовательский" для CLR и получить тот же результат.

Большое спасибо за помощь всем!

Ответ 19

"Кроме того, вы можете ввести код в уловить все необработанные исключения. Читать ссылка для получения дополнительной информации, но основы эти две строки.

Это неверно. Это использовалось, чтобы поймать все необработанные исключения в .NET 1.0/1.1, но это была ошибка, и это не было сделано, и она была исправлена ​​в .NET 2.0.

AppDomain.CurrentDomain.UnhandledException 

Используется только для использования в качестве последнего салона регистрации, чтобы вы могли регистрировать исключение до выхода программы. Он не поймает исключение с 2.0 и выше (хотя в .NET 2.0 по крайней мере есть значение конфигурации, которое вы можете изменить, чтобы заставить его действовать как 1.1, но не рекомендуется использовать его.).

Стоит отметить, что есть несколько исключений, которые вы не можете поймать, например StackOverflowException и OutOfMemoryException. В противном случае, как предполагали другие люди, это могло бы быть исключением в фоновом потоке. Также я уверен, что вы не можете поймать некоторые/все неуправляемые/нативные исключения.

Ответ 20

Я не понимаю... ваш блок catch просто генерирует новое исключение (с тем же сообщением). Это означает, что ваше утверждение:

Проблема заключается в том, что в некоторых случаях (не все) мой блок try/catch не поймает его и вместо этого прекратит выполнение как необработанное исключение.

- это именно то, что ожидается.

Ответ 21

Я согласен с Daniel Auger и kronoz, что это пахнет как исключение, которое имеет что-то делать с потоками. Помимо этого, вот мои другие вопросы:

  • Что говорит полное сообщение об ошибке? Что это за исключение?
  • На основе трассировки стека, которую вы указали здесь, не является ли исключение, вызванное вашим кодом в TimeDefLexer.mTokens()?

Ответ 22

Я не уверен, что я неясен, но если это так, я вижу, что отладчик останавливает выполнение с помощью "Необработанного исключения" типа NoViableAltException. Вначале я ничего не знал об этом пункте меню "Отладка- > Исключения", потому что MS ожидает, что вы на время установки VS должны зафиксировать профиль, когда вы не представляете, как они отличаются. По-видимому, Я не был в профиле С# dev и отсутствовал этот параметр. После окончательной отладки всех исключенных CLR-исключений я, к сожалению, не смог обнаружить какое-либо новое поведение, ведущее к причине этой необработанной проблемы исключения. Все отброшенные исключения ожидались и предположительно обрабатывались в блоке try/catch.

Я просмотрел внешнюю сборку, и нет доказательств многопоточности. Под этим я имею в виду, что ссылки на System.Threading и никакие делегаты не использовались. Я знаком с тем, что создает экземпляр потока. Я проверяю это, наблюдая панель инструментов Threads во время необработанного исключения, чтобы просмотреть только один поток.

У меня есть открытая проблема с людьми ANTLR, поэтому, возможно, им удалось решить эту проблему раньше. Я смог воспроизвести его в простом проекте консольного приложения с использованием .NET 2.0 и 3.5 в VS 2008 и VS 2005.

Это просто боль, потому что он заставляет мой код работать только с известным действительным входом парсера. Использование метода IsValid() было бы рискованным, если бы оно выбрало необработанное исключение, основанное на пользовательском вводе. Я буду держать этот вопрос в курсе, когда об этом узнают больше.

Ответ 23

@spoulson,

Если вы можете воспроизвести его, можете ли вы разместить его где-нибудь? Один из проспектов, который вы можете попробовать, - это использовать WinDBG с расширениями SOS для запуска приложения и захвата необработанного исключения. Он будет разбиваться на первое исключение вероятности (до того, как среда выполнения попытается найти обработчик), и вы можете видеть в тот момент, откуда она идет, и какой поток.

Если вы еще не использовали WinDBG, это может быть немного подавляющим, но здесь хороший учебник:

http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx

Как только вы запустите WinDBG, вы можете переключить разрыв необработанных исключений, перейдя в Debug- > Фильтры событий.

Ответ 24

Ничего себе, поэтому из отчетов до сих пор 2 работали правильно, и я испытал проблему, о которой я сообщал. Каковы версии Windows, Visual Studio и .NET Framework с номерами сборки?

Я запускаю XP SP2, VS 2008 Team Suite (9.0.30729.1 SP), С# 2008 (91899-270-92311015-60837) и .NET 3.5 SP1.

Ответ 25

Если вы используете COM-объекты в своем проекте и пытаетесь блокировать блокировки, вы не должны исключать исключения, вам нужно отключить Tools/Debugging/Break, если исключения пересекаются с опцией AppDomain или управляемыми/родными границами (только для управляемого).