Dlaczego is.NET wyjątek nie złapany przez try/catch block?

Pracuję nad projektem używającym biblioteki parserów ANTLR dla C#. Zbudowałem gramatykę do analizy tekstu i działa dobrze. Jednak, gdy parser natknie się na nielegalny lub nieoczekiwany token, rzuca jeden z wielu WYJĄTKÓW. Problem polega na tym, że w niektórych przypadkach (nie we wszystkich) mój blok try/catch go nie złapie i zamiast tego zatrzyma wykonanie jako nieobsługiwany wyjątek.

Problem dla mnie polega na tym, że nie mogę replikować tego problemu nigdzie indziej niż w moim pełnym kodzie. The call stos pokazuje, że wyjątek zdecydowanie występuje w moim bloku try/catch (wyjątek). Jedyne, co przychodzi mi do głowy, to to, że pomiędzy moim kodem a kodem rzucającym wyjątek występuje kilka wywołań asemblacji ANTLR, a ta biblioteka nie ma włączonego debugowania, więc nie mogę przez to przejść. Zastanawiam się, czy nie-debuggable assemblies hamują bulgotanie WYJĄTKÓW? Stos wywołań wygląda tak; zewnętrzne wywołania asemblacji są w Antlr.Czas trwania:

    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#

Fragment kodu z bottom-most call in Parse () wygląda następująco:

     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);
     }

Dla mnie klauzula catch (Exception)powinna była uchwycić jakikolwiek wyjątek. Czy jest jakiś powód, dla którego by nie miało?

Aktualizacja: prześledziłem montaż zewnętrzny z odbłyśnikiem i nie znalazłem żadnych śladów gwintowania. Assembly wydaje się być tylko klasą narzędziową dla wygenerowanego kodu ANTLR. Rzucony wyjątek pochodzi z TimeDefLexer.metoda mTokens () i jej typ to NoViableAltException, który wywodzi się z RecognitionException - > Exception. Ten wyjątek jest wyrzucany, gdy lexer nie może zrozumieć następnego tokena w strumieniu; innymi słowy, nieprawidłowe wejście. Ten wyjątek powinien się zdarzyć, jednak powinien zostać złapany przez mój blok try / catch.

Również ponowne rozważenie ParserException jest naprawdę nieistotne dla tej sytuacji. Jest to warstwa abstrakcji, która bierze dowolny wyjątek podczas parsowania i konwertuje do mojego własnego ParserException. Problem z obsługą WYJĄTKÓW jestem doświadczanie nigdy nie dociera do tej linii kodu. W rzeczywistości skomentowałem część "throw new ParserException" i nadal otrzymałem ten sam wynik.

Jeszcze jedno, zmodyfikowałem oryginalny blok try/catch, o którym mowa, aby zamiast niego złapać NoViableAltException, eliminując wszelkie nieporozumienia związane z dziedziczeniem. Nadal otrzymałem ten sam wynik.

Ktoś kiedyś zasugerował, że czasami VS jest nadaktywny przy wyłapywaniu obsługiwanych WYJĄTKÓW w trybie debugowania, ale ten problem występuje również w tryb release.

Stary, wciąż jestem zakłopotany! Nie wspominałem o tym wcześniej, ale uruchamiam VS 2008 i cały mój kod to 3.5. Montaż zewnętrzny to 2.0. Ponadto, niektóre z moich podklas kodu klasy w 2.0 assembly. Czy niedopasowanie wersji może powodować ten problem?

Aktualizacja 2: udało mi się wyeliminować konflikt wersji. NET poprzez przeniesienie odpowiednich części mojego kodu. NET 3.5 do projektu. NET 2.0 i powtórzenie tego samego scenariusza. Udało mi się odtworzyć ten sam wyjątek podczas konsekwentnego działania w. NET 2.0.

Dowiedziałem się, że ANTLR niedawno wydał 3.1. Tak więc zaktualizowałem z 3.0.1 i ponownie przetestowałem. Okazuje się, że wygenerowany kod jest trochę refakturowany, ale ten sam nieobsługiwany wyjątek występuje w moich testowych przypadkach.

Aktualizacja 3: Powtórzyłem ten scenariusz w projekcie uproszczonym VS 2008 . Zachęcamy do pobrania i sprawdzenia projektu dla siebie. Zastosowałem wszystkie wspaniałe sugestie, ale nie byłem w stanie pokonaj tę przeszkodę jeszcze.

Jeśli możesz znaleźć obejście, podziel się swoimi odkryciami. Jeszcze raz dziękuję!


Dziękuję, ale VS 2008 automatycznie łamie się na nieobsługiwanych wyjątkach. Nie mam też okna dialogowego Debug - >Exceptions. Rzucony obiekt NoViableAltException jest w pełni przeznaczony i przeznaczony do przechwytywania przez kod użytkownika. Ponieważ nie jest przechwytywany zgodnie z oczekiwaniami, wykonanie programu zostaje nieoczekiwanie zatrzymane jako nieobsługiwany wyjątek.

Rzucony wyjątek pochodzi z Wyjątek i nie ma wielowątkowości w ANTLR.

Author: spoulson, 2008-08-30

25 answers

Chyba Rozumiem problem. Wyjątek jest wyłapywany, problemem jest zamieszanie w zachowaniu debuggera i różnice w Ustawieniach debuggera wśród każdej osoby próbującej go zmienić.

W trzecim przypadku z twojego repro wydaje mi się, że otrzymujesz następujący komunikat: "NoViableAltException nie był obsługiwany przez kod użytkownika" i callstack, który wygląda tak:

         [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] 

Jeśli klikniesz prawym przyciskiem myszy w oknie callstack i uruchomisz włącz Pokaż Zewnętrzny kod, który widzisz to:

        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

Komunikat debuggera mówi ci, że wyjątek pochodzący spoza twojego kodu (od NoViableAlt) przechodzi przez kod, który posiadasz w TestAntlr-3.1.exe!TimeDefLexer.mTokens () bez obsługi.

Sformułowanie jest mylące, ale nie oznacza, że wyjątek jest nieuwzględniony. Debugger daje Ci znać, że kod, który posiadasz mTokens () " musi być odporny na ten wyjątek.

Rzeczy do zabawy, aby zobaczyć, jak to wygląda ci, którzy nie nagrodzili problemu:

  • przejdź do Narzędzia/Opcje / debugowanie i Wyłącz "Włącz tylko mój kod (Tylko zarządzane)". albo opcja.
  • przejdź do Debugger / Exceptions i wyłącz "user-unhandled" dla Wyjątki Środowiska Uruchomieniowego W Języku Potocznym.
 29
Author: Steve Steiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 05:54:23

Niezależnie od tego, czy assembly został skompilowany jako release build, wyjątek z pewnością powinien być "bąbelkowy" aż do wywołującego, nie ma powodu, aby assembly nie był kompilowany w trybie debugowania.

Zgadzam się z Danielem, który sugeruje, że być może wyjątek występuje w oddzielnym wątku-spróbuj podłączyć Zdarzenie wyjątku wątku w aplikacji.ThreadException. Powinno to zostać podniesione, gdy wystąpi dowolny nieobsługiwany wyjątek wątku. Możesz się dostosować Twój kod tak: -

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;
 }
 8
Author: ljs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 15:34:44

Mogę ci powiedzieć, co się tu dzieje...

Visual Studio łamie się, ponieważ uważa, że wyjątek jest nieobsługiwany. Co oznacza nieobsługiwany? Cóż, w Visual Studio, jest ustawienie w narzędziach... Opcje... Debugowanie... Generale... "Włącz tylko Mój kod (tylko zarządzany)". Jeśli ta opcja jest zaznaczona i jeśli wyjątek rozprzestrzenia się poza Twój kod i poza ramkę stosu powiązaną z wywołaniem metody, która istnieje w złożeniu, które nie jest Twoim kodem( na przykład Antlr), to jest uważany za "nieobsadzony". Z tego powodu wyłączam, że włączam tylko funkcję mojego kodu. Ale moim zdaniem to kiepskie... powiedzmy, że to zrobisz:

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

DoSomething wywołuje tam funkcję anonimową I Ta funkcja rzuca wyjątek...

Zauważ, że jest to" nieobsługiwany wyjątek "według Visual Studio, jeśli włączona jest opcja "Włącz tylko Mój kod". Zauważ również, że zatrzymuje się tak, jakby był punktem przerwania, gdy jest w trybie debugowania, ale w środowisku bez debugowania lub produkcyjnym, kod jest w pełni poprawny i działa zgodnie z oczekiwaniami. Ponadto, jeśli po prostu "kontynuować" w debugerze, aplikacja idzie na to wesoły sposób (nie zatrzymuje wątku). Jest on uważany za "nieobsługiwany", ponieważ wyjątek propaguje się przez ramkę stosu, która nie znajduje się w kodzie (np. w bibliotece zewnętrznej). Moim zdaniem jest kiepsko. Proszę zmienić to domyślne zachowanie Microsoft. Jest to doskonale poprawny przypadek użycia WYJĄTKÓW do sterowania logiką programu. Czasami nie można zmienić osoby trzeciej biblioteka zachowuje się w inny sposób i jest to bardzo przydatny sposób na wykonanie wielu zadań.

Weźmy na przykład MyBatis, możesz użyć tej techniki, aby zatrzymać przetwarzanie rekordów, które są zbierane przez wywołanie SqlMapper.QueryWithRowDelegate.

 5
Author: Tony Schwartz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-20 19:39:51

Czy używasz. Net 1.0 Czy 1.1? Jeśli tak, to catch (Exception ex) Nie wyłapie WYJĄTKÓW z kodu niezarządzanego. Zamiast tego musisz użyć catch {}. Więcej szczegółów można znaleźć w tym artykule:

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

 4
Author: tbreffni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 16:07:42

Czy to możliwe, że wyjątek jest wrzucany do innego wątku? Oczywiście twój kod wywoławczy jest jednowątkowy, ale być może biblioteka, której używasz, wykonuje kilka wielowątkowych operacji pod okładkami.

 3
Author: Daniel Auger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 15:36:03

Jestem z @ Shaun Austin-spróbuj zawijać try z pełną kwalifikowaną nazwą

catch (System.Exception)
I zobacz, czy to pomoże.Czy Doc ANTLR mówi jakie wyjątki należy wyrzucać?
 3
Author: JamesSugrue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 17:08:45

Osobiście nie jestem przekonany do teorii gwintowania w ogóle.

Raz widziałem to wcześniej, pracowałem z biblioteką, która również zdefiniowała wyjątek i użycie miałem na myśli, że rzeczywisty Catch odnosi się do innego typu "wyjątku" (jeśli był w pełni wykwalifikowany, to firma.Lib.Wyjątek, ale to nie było z powodu użycia) więc jeśli chodzi o wyłapywanie normalnego wyjątku, który był wyrzucany (jakiś wyjątek argumentu, jeśli dobrze pamiętam) to po prostu nie złapał, bo Typ nie pasował.

Podsumowując, czy istnieje inny typ wyjątku w innej przestrzeni nazw, który jest używany w tej klasie?

EDIT: szybkim sposobem sprawdzenia tego jest upewnienie się, że w klauzuli catch w pełni kwalifikujesz Typ wyjątku jako " System.Wyjątek " i daj mu wir!

EDIT2: OK wypróbowałem kod i na razie się nie poddaję. Będę musiał spojrzeć na to jeszcze raz rano, jeśli nikt nie wymyślił rozwiązania.

 3
Author: Shaun Austin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 20:33:41

Dla mnie klauzula catch (Exception)powinna była uchwycić jakikolwiek wyjątek. Czy jest jakiś powód, dla którego by nie miało?

Jedyną możliwością, jaką mogę wymyślić, jest to, że coś innego jest złapanie go przed tobą i obchodzenie się z nim w sposób, który wydaje się być nieobciążonym wyjątkiem (np. wyjście z procesu).

Mój blok try / catch nie złapie go i zamiast tego zatrzyma wykonanie jako nieobsługiwany wyjątek.

Musisz znaleźć to, co powoduje wyjście proces. Może to być coś innego niż nieobsługiwany wyjątek. Możesz spróbować użyć natywnego debuggera z punktem przerwania ustawionym na " {,, kernel32.dll}ExitProcess". Następnie użyj SOS, aby określić, który kod zarządzany wywołuje proces zakończenia.

 2
Author: Steve Steiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 04:28:00

Hmm, nie rozumiem problemu. Pobrałem i wypróbowałem Twój przykładowy plik rozwiązania.

Wyjątek jest wyrzucany w TimeDefLexer.cs, linia 852, która jest następnie obsługiwana przez blok catch w programie.cs, który po prostu mówi obsłużony wyjątek .

Jeśli odkomentuję blok catch nad nim, wejdzie on do tego bloku.

W czym problem?

Jak powiedział Kibbee, Visual Studio zatrzyma się na wyjątkach, ale jeśli poprosisz o kontynuację, wyjątek zostanie złapany przez Twój kod.

 2
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 20:47:39

Pobrałem przykładowy projekt VS2008 i tutaj też jestem trochę zakłopotany. Udało mi się jednak ominąć wyjątki, chociaż prawdopodobnie nie w sposób, który będzie działał świetnie dla Ciebie. Ale oto co znalazłem:

Ten post na liście dyskusyjnej miał omówienie tego, co wygląda na ten sam problem, którego doświadczasz.

Stamtąd, dodałem kilka klas atrapy w głównym programie.plik 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)
    {
    }
}

, a następnie dodano linie using do TimeDefParser.cs i TimeDefLexer.cs:

using NoViableAltException = MyNoViableAltException;
using EarlyExitException = NoViableAltException; 

Z tym, że wyjątki bąbelkowe do fałszywych klas wyjątków i mogą być tam obsługiwane, ale nadal był wyjątek wyrzucany w metodzie mTokens w TimeDefLexer.cs. Zawijanie tego w Try catch w tej klasie przechwyciło wyjątek:

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

Naprawdę nie rozumiem, dlaczego owijanie go w wewnętrzną metodę, a nie gdzie jest wywoływany z obsługi błędu, jeśli wątek nie jest w grze, ale w każdym razie mam nadzieję, że to wskaże kogoś mądrzejszy ode mnie w dobrym kierunku.

 2
Author: Scott Nichols,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 22:27:54

Pobrałem Twój kod i wszystko działa zgodnie z oczekiwaniami.

Debugger Visual Studio poprawnie przechwytuje wszystkie wyjątki. Catch bloki pracy zgodnie z oczekiwaniami.

Używam Windows 2003 server SP2, VS2008 Team Suite (9.0.30729.1 SP)

Próbowałem skompilować Twój projekt dla. NET 2.0, 3.0 & 3.5

@Steve Steiner, opcje debuggera, o których wspomniałeś, nie mają nic wspólnego z tym zachowaniem.

Próbowałem grać tymi opcjami bez widocznych efektów-catch bloki zdołały przechwycić wszystkie wyjątki.

 2
Author: aku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 05:52:15

Steve Steiner ma rację, że wyjątek pochodzi z biblioteki antlr, przechodzi przez metodę mTokens () i jest przechwytywany w bibliotece antlr. Problem polega na tym, że metoda ta jest automatycznie generowana przez antlr. Dlatego wszelkie zmiany w obsłudze wyjątku w mTokens () zostaną nadpisane podczas generowania klas parsera/lexera.

Domyślnie, antlr rejestruje błędy i próbuje odzyskać parsowanie. Możesz nadpisać to tak, że parser.prog () wyrzuci wyjątek w przypadku wystąpienia błędu. Z twojego przykładowego kodu myślę, że jest to zachowanie, którego się spodziewałeś.

Dodaj ten kod do swojego grammer (.g) plik. Musisz również wyłączyć "Włącz tylko Mój kod" w menu debugowania.

@members {

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

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

To jest moja próba stworzenia wersji C# przykładu podanego w rozdziale "Exiting the recogniser on first error" w książce "Definitive ANTLR Reference".

Mam nadzieję, że tego właśnie szukałeś.
 2
Author: Dave Turvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-10 12:57:13

Możesz skonfigurować VS.Net złamać, gdy tylko wystąpi jakikolwiek wyjątek. Po prostu uruchom projekt w trybie debugowania, a zostanie on zatrzymany, gdy tylko zostanie wyrzucony wyjątek. Więc powinieneś wiedzieć, dlaczego go nie złapano.

Możesz też dodać kod , aby wyłapać wszystkie nieobsługiwane wyjątki . Przeczytaj link, aby uzyskać więcej informacji, ale podstawy są te dwie linie.

Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionHandler);

 // Catch all unhandled exceptions in all threads.
 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);
 1
Author: Kibbee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 15:36:05

Oh I w nawiązaniu do tego, co powiedział Kibbee; jeśli wybierzesz Debug / Exceptions W VS i po prostu klikniesz wszystkie pola w kolumnie 'throwed', powinien wybrać Wszystko jako 'wyjątek pierwszej szansy', tzn. VS wskaże kiedy wyjątek jest o do przetworzenia przez Wszystko inne i złamać odpowiedni kod. Powinno to pomóc w debugowaniu.

 1
Author: ljs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 15:42:48

Najlepsza opcja brzmi jak ustawienie programu Visual Studio, aby złamał wszystkie nieobsługiwane wyjątki (debug -> exceptions dialog, zaznacz pole "Common Language Runtime Exceptions" i ewentualnie inne). Następnie uruchom program w trybie debugowania. Gdy kod parsera ANTLR wyrzuca wyjątek, powinien on zostać przechwycony przez Visual Studio i pozwolić Ci zobaczyć, gdzie występuje, typ wyjątku itp.

Bazując na opisie, blok połowu wydaje się być poprawny, więc jeden z kilku things could be happening:

  1. parser nie wyrzuca wyjątku
  2. parser ostatecznie wyrzuca coś, co nie pochodzi z systemu.Exception
  3. istnieje wyjątek rzucany na inny wątek, który nie jest obsługiwany

Wygląda na to, że potencjalnie wykluczyłeś wydanie # 3.

 1
Author: Scott Dorman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-31 14:58:10

Prześledziłem montaż zewnętrzny z odbłyśnikiem i nie znalazłem żadnych śladów gwintowania.

Nie można znaleźć żadnego wątku nie oznacza, że nie ma wątku

. NET ma "pulę wątków", która jest zbiorem "zapasowych" wątków, które siedzą głównie bezczynnie. Niektóre metody powodują uruchamianie rzeczy w jednym z wątków puli wątków, dzięki czemu nie blokują one głównej aplikacji.

Rażącymi przykładami są takie rzeczy jak ThreadPool.QueueUserWorkItem , ale jest wiele, wiele innych rzeczy, które mogą również uruchamiać rzeczy w puli wątków, które nie wyglądają tak oczywiste, jak Delegate .BeginInvoke

Naprawdę, musisz zrobić to, co kibbee sugeruje.
 1
Author: Orion Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:06

Czy próbowałeś wydrukować (Console.WriteLine ()) wyjątek wewnątrz klauzuli catch, a nie używać visual studio i uruchomić aplikację na konsoli?

 1
Author: Eduardo Diaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 15:45:25

Uważam, że Steve Steiner ma rację. Podczas badania sugestii Steve 'a natknąłem się na Ten wątek mówiący o opcji" Włącz tylko Mój kod " w Tools|Options|Debugger|General. Sugeruje się, że debugger złamie się w pewnych warunkach, gdy kod Nie użytkownika rzuci lub obsłuży wyjątek. Nie jestem do końca pewien, dlaczego to w ogóle ma znaczenie, lub dlaczego debugger wyraźnie mówi, że wyjątek był nieobsługiwany, gdy naprawdę był.

Udało mi się wyeliminować fałszywe przerwy przez wyłączenie opcji "Włącz tylko Mój kod". To również zmienia okno dialogowe debugowanie|wyjątki, usuwając kolumnę" obsługiwane przez użytkownika", ponieważ nie ma ona już zastosowania. Możesz też odznaczyć pole" obsługiwane przez Użytkownika " dla CLR i uzyskać ten sam wynik.

Wielkie dzięki za pomoc wszystkim!

 1
Author: spoulson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 10:17:12

" można też wstawić jakiś kod do Złap wszystkie nieobsługiwane wyjątki. Czytaj link po więcej informacji, ale podstawy to te dwie linie."

To fałsz. To używane do przechwytywania wszystkich nieobsługiwanych wyjątków w. NET 1.0/1.1, ale był to błąd i nie miało i zostało naprawione w. NET 2.0.
AppDomain.CurrentDomain.UnhandledException 

Jest przeznaczony tylko do logowania ostatniej szansy, więc możesz zalogować wyjątek przed zakończeniem programu. Nie złapie wyjątku od wersji 2.0 (chociaż w. NET 2.0 przynajmniej istnieje wartość konfiguracyjna, którą możesz zmodyfikować, aby działała jak 1.1, ale nie zaleca się tego używać.).

Warto zauważyć, że istnieje kilka wyjątków, których nie można złapać , takich jak StackOverflowException i OutOfMemoryException. W przeciwnym razie, jak sugerowały inne osoby, może to być wyjątek w jakimś wątku w tle. Również jestem prawie pewien, że nie można złapać niektóre / Wszystkie niezarządzane / rodzimych WYJĄTKÓW albo.

 0
Author: Quibblesome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 16:10:27

Nie rozumiem...blok catch po prostu rzuca nowy wyjątek (z tym samym komunikatem). Co oznacza, że Twoja wypowiedź:

Problem polega na tym, że w niektórych przypadkach (nie we wszystkich) mój blok try/catch go nie złapie i zamiast tego zatrzyma wykonanie jako nieobsługiwany wyjątek.

Jest dokładnie tym, czego oczekuje .

 0
Author: Mark Brackett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-30 16:10:28

Zgadzam się z Danielem Augerem i kronozem że to pachnie wyjątkiem, który ma coś wspólnego z wątkami. Poza tym, oto moje inne pytania:

  1. co mówi pełny komunikat o błędzie? Co to za wyjątek?
  2. W oparciu o ślad stosu, który podałeś tutaj, nie jest wyjątkiem rzucanym przez Twój kod w TimeDefLexer.mTokens ()?
 0
Author: flipdoubt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:11

Nie jestem pewien, czy jestem niejasny, ale jeśli tak, widzę wstrzymanie wykonania debuggera z "nieobsługiwanym wyjątkiem" typu NoViableAltException. Początkowo nic nie wiedziałem o tej pozycji menu Debug- > Exceptions, ponieważ MS oczekuje od Ciebie, w czasie instalacji, zaangażowania w profil, gdy nie masz pojęcia, czym się różnią. Najwyraźniej nie byłem na profilu C # dev i brakowało mi tej opcji . Po wreszcie debugowaniu wszystkich wyrzuconych WYJĄTKÓW CLR, byłem niestety nie można wykryć żadnego nowego zachowania prowadzącego do przyczyny tego nieobsługiwanego problemu z wyjątkiem. Wszystkie rzucone wyjątki były oczekiwane i rzekomo obsługiwane w bloku try/catch.

Przejrzałem montaż zewnętrzny i nie ma dowodów na wielowątkowość. Chodzi mi o to, że nie ma odniesienia do systemu.Gwintowanie i nie używano w ogóle żadnych delegatów. Znam ten wątek. Sprawdzam to obserwując Toolbox wątków w czasie nieobsługiwany wyjątek do wyświetlenia jest tylko jeden uruchomiony wątek.

Mam otwarty problem z ludźmi z ANTLR, więc być może byli w stanie rozwiązać ten problem wcześniej. Udało mi się odtworzyć go w prostym projekcie aplikacji konsolowej przy użyciu.NET 2.0 i 3.5 pod VS 2008 i VS 2005.

To tylko problem, ponieważ zmusza mój kod do pracy tylko ze znanym poprawnym wejściem parsera. Użycie metody IsValid() byłoby ryzykowne, gdyby wywołała nieobsługiwany wyjątek oparty na danych wejściowych użytkownika. I ' ll keep to pytanie jest aktualne, gdy więcej dowie się na ten temat.

 0
Author: spoulson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 14:08:43

@ spoulson,

Jeśli możesz to skopiować, możesz to gdzieś zamieścić? Jedną z dróg, którą możesz wypróbować, jest usign WinDBG z rozszerzeniami SOS, aby uruchomić aplikację i złapać nieobsługiwany wyjątek. Złamie się na wyjątku pierwszej szansy (zanim runtime spróbuje znaleźć obsługę) i możesz zobaczyć w tym momencie, skąd pochodzi i jaki wątek.

Jeśli wcześniej nie używałeś WinDBG, może to być trochę przytłaczające, ale tutaj jest dobry tutorial:

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

Po uruchomieniu WinDBG, możesz przełączyć łamanie nieobsługiwanych wyjątków, przechodząc do Debug - >filtry zdarzeń.

 0
Author: Cory Foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-02 14:30:56

Wow, więc z raportów do tej pory, 2 działało poprawnie, a 1 doświadczył problemu, który zgłosiłem. Jakie są wersje Windows, Visual Studio i. NET framework z numerami kompilacji?

[[0]] używam XP SP2, VS 2008 Team Suite (9.0.30729.1 SP), C# 2008 (91899-270-92311015-60837) i. NET 3.5 SP1.
 0
Author: spoulson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 01:21:06

Jeśli używasz obiektów com Twój projekt i spróbuj złapać bloki nie złapać wyjątki będziesz musiał wyłączyć narzędzia / debugowanie/Break gdy wyjątki cross AppDomain lub zarządzane / natywne granice (tylko zarządzane) opcja.

 0
Author: Daghan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 09:19:39