Pourquoi? is.NET l'exception n'est pas prise par le bloc "essayer/attraper"?
je travaille sur un projet en utilisant la bibliothèque ANTLR parser pour C#. J'ai construit une grammaire pour analyser quelques textes et ça marche bien. Cependant, lorsque l'analyseur tombe sur un jeton illégal ou inattendu, il lance l'une des nombreuses exceptions. Le problème est que dans certains cas (pas tous), mon bloc try / catch ne l'attrapera pas et stoppera l'exécution comme une exception.
le problème pour moi, c'est que je ne peux pas reproduire ce problème n'importe où d'autre, mais dans mon code complet. La pile d'appels montre que l'exception se produit certainement dans mon bloc try/catch(Exception). La seule chose à laquelle je pense, c'est qu'il y a quelques appels d'assemblage ANTLR qui se produisent entre mon code et le code lançant l'exception et cette bibliothèque n'a pas de débogage activé, donc je ne peux pas passer à travers. Je me demande si les assemblages non-déboguables inhibent le bouillonnement d'exception? La pile d'appels ressemble à ceci; les appels d'Assemblée externes sont dans 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#
l'extrait de code du bas-appel le plus en Parse() ressemble à:
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);
}
pour moi, une clause catch (Exception) aurait dû inclure n'importe quelle exception. Est-il une raison pourquoi il ne le serait pas?
mise à jour: j'ai tracé à travers l'assemblage externe avec réflecteur et n'ai trouvé aucun signe de filetage. L'Assemblée semble être juste une classe utilitaire d'exécution pour les produits ANTLR code. L'exception lancée est du TimeDefLexer.la méthode mTokens() et son type est NoViableAltException, qui dérive de RecognitionException -> Exception. Cette exception est lancée lorsque le lexer ne peut pas comprendre le prochain token dans le flux; en d'autres termes, entrée invalide. Cette exception est censée se produire, mais elle aurait dû être prise par mon bloc "essayer/attraper".
de plus, le fait de repenser la ParserException n'est vraiment pas pertinent dans cette situation. C'est un couche d'abstraction qui prend n'importe quelle exception pendant l'analyse et convertit en ma propre ParserException. Le problème d'exception que je rencontre n'atteint jamais cette ligne de code. En fait, j'ai commenté la partie "lancer une nouvelle ParserException" et j'ai quand même reçu le même résultat.
encore une chose, j'ai modifié le bloc try/catch original en question pour capturer à la place NoViableAltException, éliminant toute confusion d'héritage. J'ai encore reçu le même résultat.
Quelqu'un a un jour suggéré que VS est parfois trop actif sur la capture des exceptions manipulées en mode debug, mais ce problème se produit aussi en mode release.
l'Homme, je suis toujours perplexe! Je ne l'avais pas mentionné avant, mais je cours VS 2008 et tout mon code est 3,5. L'assemblage externe est 2.0. En outre, certaines de mes sous-classes de code une classe dans l'Assemblée 2.0. Pourrait une incompatibilité de version provoquer ce problème?
mise à jour 2: j'ai pu éliminer le conflit de version .NET en transférant les parties pertinentes de mon code .NET 3.5 vers un projet .NET 2.0 et reproduire le même scénario. J'ai été capable de répliquer la même exception non manipulée en exécutant de manière cohérente dans .NET 2.0.
J'ai appris que L'ANTLR a récemment publié 3.1. Donc, j'ai mis à jour de 3.0.1 et je l'ai récupéré. Il s'avère que le code généré est un peu remanié, mais la même exception non manipulée se produit dans Mes cas de test.
mise à Jour 3: J'ai reproduit ce scénario dans un simplifié VS 2008 projet . N'hésitez pas à télécharger et inspecter le projet pour vous-même. J'ai appliqué toutes les grandes suggestions, mais je n'ai pas encore réussi à surmonter cet obstacle.
si vous pouvez trouver une solution de rechange, s'il vous plaît partager vos conclusions. Merci encore!
Merci, mais VS 2008 casse automatiquement sur les exceptions non freinées. De plus, je n'ai pas de dialogue Debug->Exceptions. La Noviableatexception qui est lancée est entièrement prévue, et conçue pour être attrapée par le code de l'utilisateur. Comme il n'est pas attrapé comme prévu, l'exécution du programme s'arrête de façon inattendue en tant qu'exception inopinée.
l'exception lancée est dérivée de L'Exception et il n'y a pas de multi-threading en cours avec ANTLR.
25 réponses
je crois comprendre le problème. L'exception est d'être pris, le problème est la confusion sur le comportement du Débogueur et les différences dans les paramètres du débogueur entre chaque personne essayant de le reprogrammer.
dans le 3ème cas de votre réponse, je crois que vous recevez le message suivant: "NoViableAltException a été désactivé par le code utilisateur" et une callstack qui ressemble à ceci:
[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]
si vous faites un clic droit dans la fenêtre callstack et afficher le code externe vous voyez ceci:
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
le message du débogueur vous indique qu'une exception provenant de l'extérieur de votre code (de Noviabalt) est en train de passer par le code que vous possédez dans TestAntlr-3.1.exe!TimeDefLexer.mTokens () sans être manipulé.
le libellé prête à confusion, mais il ne signifie pas que l'exception n'est pas invoquée. Le débogueur vous fait savoir que le code que vous possédez mTokens () " doit être robuste contre cette exception d'être jeté à travers elle.
les choses à jouer avec pour voir comment cela regarde pour ceux qui n'ont pas repris le problème:
- allez à Outils/Options/Débogage et désactiver " activer juste mon code (Gérée uniquement)". ou une option.
- aller à Debugger / Exceptions et désactiver "User-unhandled" pour Exceptions À L'Exécution En Langage Commun.
que l'assemblée ait été compilée ou non en tant que compilation de la version, l'exception devrait certainement "bulle" jusqu'à l'appelant, il n'y a aucune raison pour qu'un assemblage qui n'est pas compilé en mode debug ait un impact sur cela.
Je suis D'accord avec Daniel suggère que peut - être l'exception se produit sur un thread séparé-essayer d'accrocher l'événement d'exception de thread dans l'Application.ThreadException. Ceci doit être soulevé quand n'importe quelle exception de fil non armé produire. Vous pouvez adapter votre code ainsi: -
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;
}
je peux vous dire ce qui se passe ici...
Visual Studio est en panne parce qu'il pense que l'exception n'est pas entravée. Ce n'est pas gérée veux dire? Eh bien, dans Visual Studio, il y a un réglage dans les outils... Option... Débogage... Général... "Activer juste mon Code (géré seulement)". Si ceci est coché et si l'exception se propage hors de votre code et Vers un cadre de pile associé à un appel de méthode qui existe dans un assemblage qui N'est "pas votre CODE" (pour exemple, Antlr), qui est considéré comme "non gérée". Je désactive qui Permettent Juste Mon Code pour cette raison. Mais, si vous me demandez, c'est boiteux... disons que vous faites ceci:
ExternalClassNotMyCode c = new ExternalClassNotMyCode();
try {
c.doSomething( () => { throw new Exception(); } );
}
catch ( Exception ex ) {}
doSomething appelle votre fonction anonyme et cette fonction lance une exception...
notez qu'il s'agit d'une "exception non contrôlée" selon Visual Studio si "Enable Just My Code" est activé. Aussi, notez qu'il s'arrête comme s'il s'agissait d'un point d'arrêt lorsque dans le debug mode, mais dans un environnement de non-débogage ou de production, le code est parfaitement valide et fonctionne comme prévu. En outre, si vous "continuez" simplement dans le débogueur, l'application va sur c'est merry way (elle n'arrête pas le thread). Il est considéré comme "non manipulé" parce que l'exception se propage à travers un cadre de pile qui n'est pas dans votre code (c.-à-d. dans la bibliothèque externe). Si vous me demandez, c'est moche. Veuillez modifier ce comportement par défaut Microsoft. C'est un cas parfaitement valable d'utilisation D'Exceptions pour contrôler la logique du programme. Parfois, vous ne pouvez pas changer la bibliothèque de tiers pour vous comporter d'une autre manière, et c'est une façon très utile d'accomplir de nombreuses tâches.
prenez MyBatis par exemple, vous pouvez utiliser cette technique pour arrêter le traitement des enregistrements qui sont recueillis par un appel à SqlMapper.QueryWithRowDelegate.
utilisez-vous .Net 1.0 ou 1.1? Si c'est le cas, la capture(Exception ex) ne capturera pas les exceptions du code non géré. Vous devrez utiliser catch à la place. Voir cet article pour plus de détails:
http://www.netfxharmonics.com/2005/10/net-20-trycatch-and-trycatchexception /
est-il possible que l'exception soit jetée dans un autre fil? Évidemment, votre code d'appel est un simple threaded, mais peut-être que la bibliothèque que vous utilisez effectue des opérations multithread sous les couvertures.
je suis avec @Shaun Austin - essayer d'emballer l'essai avec le nom entièrement qualifié
catch (System.Exception)
et voir si ça aide.Le doc de L'ANTLR précise-t-il les Exceptions à prévoir?
personnellement, je ne suis pas du tout convaincu par la théorie du filetage.
la seule fois où je l'ai vu avant, je travaillais avec une bibliothèque qui a également défini L'Exception et les utilisations que j'avais voulu dire que la prise réelle se référait à un différent" Exception " type (si elle avait été pleinement qualifiée, il était de la société.Lib.Exception mais ce n'était pas à cause de l'utilisation) ainsi quand il est venu à attraper une exception normale qui a été jeté (une sorte d'exception d'argument si je rappelez-vous correctement) il ne serait tout simplement pas l'attraper parce que le type ne correspond pas.
donc en résumé, y a-t-il un autre type D'Exception dans un espace de noms différent qui est dans une utilisation dans cette classe?
modifier: un moyen rapide de vérifier ce est de s'assurer que dans votre clause de capture vous qualifiez pleinement le type D'Exception comme "système.Exception" et donnez-lui un tourbillon!
EDIT2: OK j'ai essayé le code et concède la défaite pour l'instant. Je vais avoir un autre regard dans la matinée, si personne n'a trouvé de solution.
pour moi, une clause catch (Exception) aurait dû inclure n'importe quelle exception. Est-il une raison pourquoi il ne le serait pas?
la seule possibilité à laquelle je peux penser est que quelque chose d'autre l'attrape devant vous et le manipule d'une manière qui semble être une exception (par exemple sortir du processus).
mon bloc "try/catch" ne l'attrapera pas et stoppe l'exécution comme une exception non contrôlée.
vous devez trouver ce qui provoque le processus de sortie. Il pourrait être quelque chose d'autre qu'une exception non gérée. Vous pouvez essayer d'utiliser le débogueur natif avec un point de rupture défini sur " {,, kernel32.dll} ExitProcess". Ensuite, utilisez SOS pour déterminer quel code géré appelle le processus de sortie.
Hmm, je ne comprends pas le problème. J'ai téléchargé et essayé votre fichier de solution d'exemple.
une exception est lancée dans TimeDefLexer.cs, ligne 852, qui est ensuite traitée par le bloc de capture dans le programme.cs qui dit simplement: exception Gérée .
si je décompose le bloc de capture au-dessus, il entrera ce bloc à la place.
Quel est le problème?
As Kibbee a dit, Visual Studio s'arrêtera sur les exceptions, mais si vous lui demandez de continuer, l'exception se fera prendre par votre code.
j'ai téléchargé l'échantillon du projet VS2008, et je suis un peu étonné ici aussi. J'ai été en mesure d'obtenir passé les exceptions toutefois, bien que probablement pas d'une manière qui fonctionnera idéal pour vous. Mais voici ce que j'ai trouvé:
Ce liste de diffusion post a eu une discussion de ce qui semble être le même problème que vous rencontrez.
de là, j'ai ajouté quelques classes fictives dans le programme principal.fichier 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)
{
}
}
et a ensuite ajouté les lignes d'utilisation dans TimeDefParser.cs et TimeDefLexer.cs:
using NoViableAltException = MyNoViableAltException;
using EarlyExitException = NoViableAltException;
avec ce que les exceptions seraient bulle dans les classes d'exception de faux et pourrait être manipulé là, mais il y avait encore une exception étant jeté dans la méthode mTokens dans TimeDefLexer.cs.
try
{
alt4 = dfa4.Predict(input);
}
catch
{
}
Je ne comprends vraiment pas pourquoi l'emballer dans la méthode interne plutôt que là où il est appelé de gérer l'erreur si threading n'est pas en jeu, mais de toute façon espérons que cela pointera quelqu'un plus intelligent que moi ici dans la bonne direction.
j'ai téléchargé votre code et tout fonctionne comme prévu.
Visual Studio debugger intercepte correctement toutes les exceptions. Les blocs de capture fonctionnent comme prévu.
j'exécute Windows 2003 server SP2, VS2008 Team Suite (9.0.30729.1 SP)
j'ai essayé de vous compiler projet pour .NET 2.0, 3.0 & 3.5
@Steve Steiner, les options de débogueur que vous avez mentionnées n'ont rien à voir avec ce comportement.
j'ai essayé de jouer avec ces options sans effets visibles - blocs de capture ont réussi à intercepter toutes les exceptions.
Steve Steiner a raison de dire que l'exception est originaire de la bibliothèque antlr, passant par la méthode mTokens() et étant pris dans la bibliothèque antlr. Le problème est que cette méthode est générée automatiquement par antlr. Par conséquent, toute modification pour gérer l'exception dans mTokens() sera écrasée lorsque vous générerez vos classes parser/lexer.
par défaut, antlr enregistrera les erreurs et tentera de récupérer l'analyse. Vous pouvez remplacer ce donc que l'analyseur.prog() lève une exception lorsqu'une erreur est rencontrée. D'après votre code d'exemple, je pense que c'est le comportement auquel vous vous attendiez.
ajoutez ce code à votre grammer (.g) de fichier. Vous devrez également désactiver "activer juste mon Code" dans le menu de débogage.
@members {
public override Object RecoverFromMismatchedSet(IIntStream input,RecognitionException e, BitSet follow)
{
throw e;
}
}
@rulecatch {
catch (RecognitionException e)
{
throw e;
}
}
c'est mon essai à une version C# de l'exemple donné dans le chapitre" quitter le reconnaisseur sur la première erreur "du livre" référence ANTLR définitive".
L'espoir c'est ce que vous cherchez.
vous pouvez configurer VS.Net briser dès qu'une exception se produit. Il suffit d'exécuter votre projet en mode debug, et il s'arrêtera dès que l'exception est levée. Alors vous devriez avoir une meilleure idée de pourquoi il ne se fait pas attraper.
vous pouvez aussi ajouter un code à catch all unhandled exceptions . Lisez le lien pour plus d'informations, mais les bases sont ces deux lignes.
Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionHandler);
// Catch all unhandled exceptions in all threads.
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);
Oh, et en référence à ce que Kibbee dit; si vous sélectionnez Debug|Exceptions dans VS et simplement cliquer sur toutes les cases dans la 'levée' colonne, il doit choisir tout jusqu'autant que je sache comme "une exception de première chance", à savoir VS indiquera le moment où l'exception est à propos de "151920920 à traiter par tout le reste et se brisent sur le code pertinent. Cela devrait aider au débogage.
la meilleure option ressemble à définir Visual Studio pour casser sur toutes les exceptions non gérées (dialogue Debug -> Exceptions, cochez la case" Common Language Runtime Exceptions " et peut-être les autres aussi). Puis lancez votre programme en mode de débogage. Lorsque le code ANTLR parser lance une exception, elle doit être capturée par Visual Studio et vous permettre de voir où elle se produit, le type d'exception, etc.
basé sur la description, le bloc de capture semble être correct, donc une de plusieurs choses pourrait se produire:
- l'analyseur n'est pas réellement lancer une exception
- l'analyseur lance finalement quelque chose qui ne vient pas du système.Exception
- il y a une exception levée sur un autre thread qui n'est pas géré
il semble que vous avez potentiellement exclu la question #3.
j'ai tracé à travers l'assemblage externe avec réflecteur et n'ai trouvé aucun signe de filetage.
Vous ne pouvez pas trouver un filetage n'y a pas de filetage
.NET a un 'pool de threads'qui est un ensemble de' spare ' threads qui s'asseyent autour de la plupart des inactifs. Certaines méthodes font tourner les choses dans l'un des threads de thread pool pour qu'elles ne bloquent pas votre application principale.
les exemples flagrants sont des choses comme ThreadPool.QueueUserWorkItem , mais il ya beaucoup et beaucoup d'autres choses qui peuvent également exécuter des choses dans la piscine de fil qui ne semblent pas si évident, comme délégué.BeginInvoke
vraiment, il faut faire ce que kibbee suggère .
avez-vous essayé d'imprimer (Console.WriteLine ()) l'exception à l'intérieur de la clause catch, et ne pas utiliser visual studio et lancer votre application sur console?
je crois que Steve Steiner a raison. En cherchant les suggestions de Steve, je suis tombé sur this thread en parlant de l'option" Enable Just My Code " dans Tools|Options|Debugger|General. Il est suggéré que le débogueur se casse dans certaines conditions lorsque le code non-utilisateur lance ou gère une exception. Je ne sais pas exactement pourquoi cela importe, ni pourquoi le débogueur dit spécifiquement que l'exception n'a pas été manipulée alors qu'elle l'était vraiment.
j'ai pu éliminer les fausses pauses en désactivant l'option" Activer juste mon Code". Cela modifie également la boîte de dialogue Debug|Exceptions en supprimant la colonne "User-handled" car elle ne s'applique plus. Ou, vous pouvez simplement décocher la case" User-handled " pour CLR et obtenir le même résultat.
Merci beaucoup pour l'aide tout le monde!
" en outre, vous pouvez mettre un peu de code attrapez toutes les exceptions. Lire le lien pour plus d'informations, mais les bases ce sont ces deux lignes."
C'est faux. Cela permettait de saisir toutes les exceptions non gérées dans .NET 1.0/1.1 mais c'était un bug et il n'était pas supposé le faire et il a été corrigé dans .NET 2.0.
AppDomain.CurrentDomain.UnhandledException
est seulement destiné à être utilisé comme un saloon de journalisation de dernière chance afin que vous puissiez enregistrer l'exception avant le programme se termine. À partir de 2.0, Il n'y aura plus d'exception (bien que dans .NET 2.0 Il y ait au moins une valeur de configuration que vous pouvez modifier pour la faire agir comme 1.1, mais il n'est pas recommandé de l'utiliser.).
il est intéressant de noter qu'il existe quelques exceptions qui vous ne peut pas s'accrocher, comme StackOverflowException et OutOfMemoryException. Autrement, comme d'autres personnes l'ont suggéré, il pourrait s'agir d'une exception dans un fil de fond quelque part. Aussi, je suis je suis sûr que vous ne pouvez pas attraper certaines/toutes les exceptions non gérées/natives non plus.
je ne comprends pas...votre catch block ne fait que lancer une nouvelle exception (avec le même message). Ce qui signifie que votre déclaration de:
le problème est que dans certains cas (pas tous), mon bloc "essayer/attraper" ne l'attrape pas et arrête l'exécution en tant qu'exception non contrôlée.
est exactement ce qui est prévu d'arriver.
je suis d'accord avec Daniel Auger et kronoz que ce sent comme une exception qui a quelque chose à voir avec les threads. Au-delà de cela, Voici mes autres questions:
- que dit le message d'erreur complet? Quel type d'exception est-il?
- basé sur la trace de pile que vous avez fourni ici, n'est pas l'exception lancée par votre code dans TimeDefLexer.mTokens ()?
Je ne suis pas sûr que je ne sois pas clair, mais si c'est le cas, je vois le débogueur arrêter l'exécution avec une" Exception non contrôlée " de type Noviable Altexception. Au départ, je ne savais rien à propos de cet élément du menu Debug->Exceptions parce que MS s'attend à ce que vous vous engagiez dans un profil au moment de L'installation de VS lorsque vous n'avez aucune idée de la façon dont ils sont différents. Apparemment, Je n'étais pas sur le profil c# dev et je manquais cette option . Après avoir enfin débogué toutes les exceptions CLR lancées, Je n'ai malheureusement pas pu découvrir de nouveau comportement conduisant à la raison de ce problème d'exception sans entrave. Toutes les exceptions lancées étaient attendues et supposées être traitées dans un bloc "essayer/attraper".
j'ai examiné l'Assemblée externe et il n'y a aucune preuve de multithreading. Par cela, je veux dire aucune référence n'existe de Système.Filetage et pas de délégués ont été utilisés que ce soit. Je suis familier avec cela constitue instanciating un fil. Je vérifie cela en observant le La boîte à outils Threads au moment de l'exception unhandled à voir il n'y a qu'un seul thread en cours d'exécution.
j'ai un problème ouvert avec les gens D'ANTLR alors peut-être qu'ils ont été en mesure de s'attaquer à ce problème avant. J'ai pu le répliquer dans un simple projet d'application console en utilisant .NET 2.0 et 3.5 sous VS 2008 et VS 2005.
c'est juste un point douloureux parce que ça force mon code à ne fonctionner qu'avec l'entrée valide de l'analyseur. L'utilisation d'une méthode IsValid()
serait risqué s'il a jeté une exception sans entrave basée sur l'entrée de l'utilisateur. Je tiendrai cette question à jour lorsque j'en saurai plus à ce sujet.
@spoulson,
Si vous pouvez le reproduire, pouvez-vous poster quelque part? Une avenue que vous pourriez essayer est usign WinDBG avec les extensions SOS pour exécuter l'application et attraper l'exception non manipulée. Il se casse à l'exception de la première chance (avant que l'exécution ne cherche un handler) et vous pouvez voir à ce point d'où il vient, et quel thread.
si vous n'avez pas utilisé WinDBG avant, il peut être un peu écrasante, mais voici un bon tutorial:
http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx
une fois que vous démarrez WinDBG, vous pouvez basculer le bris des exceptions non gérées en allant dans Debug->Event Filters.
Wow, donc des rapports jusqu'à présent, 2 fonctionnaient correctement, et 1 a connu le problème que j'ai rapporté. Quelles sont les versions de Windows, Visual Studio utilisées et .net framework avec des numéros de build?
i'm running XP SP2, VS 2008 Team Suite (9.0.30729.1 SP), C# 2008 (91899-270-92311015-60837), and .NET 3.5 SP1.
si vous utilisez des objets com de votre projet et essayez des blocs catch Non catch les exceptions, vous aurez besoin de désactiver les outils/débogage/Break lorsque les exceptions traversent les limites D'AppDomain ou managed/native(Managed only) option.