2009-09-09 5 views
1

J'ai IronPython incorporé dans une application C#. Je laisse les utilisateurs écrire des scripts IronPython, dans lesquels ils peuvent importer un ensemble de bibliothèques standard livrées avec IronPython. Dans ces scripts, lorsqu'un utilisateur importe la bibliothèque "random" ou la bibliothèque "filecmp", une exception GeneratorExitException non gérée est générée.Unhandled GeneratorExitException levée lors de l'importation de la bibliothèque dans IronPython incorporé

D'autres bibliothèques comme math, re, string et os sont importables par les utilisateurs sans aucun problème.

Ceci est la trace de la pile que je reçois:

IronPython.dll!IronPython.Runtime.PythonGenerator.ThrowThrowable() + 0x85 bytes 
IronPython.dll!IronPython.Runtime.PythonGenerator.CheckThrowable() + 0x27 bytes 
IronPython.dll!IronPython.Runtime.PythonGenerator.CheckThrowableAndReturnSendValue() + 0x3c bytes 
IronPython.dll!IronPython.Runtime.Operations.PythonOps.GeneratorCheckThrowableAndReturnSendValue(object self = {IronPython.Runtime.PythonGenerator}) + 0x49 bytes 
Snippets.debug.scripting!S$12.lambda_method$344(ref int state = -1, ref object current = null) + 0x124 bytes Unknown 
Microsoft.Scripting.dll!Microsoft.Scripting.Runtime.GeneratorEnumerator<object>.System.Collections.IEnumerator.MoveNext() + 0x3c bytes 
IronPython.dll!IronPython.Runtime.PythonGenerator.MoveNextWorker() + 0xa3 bytes 
IronPython.dll!IronPython.Runtime.PythonGenerator.System.Collections.IEnumerator.MoveNext() + 0x42 bytes  
IronPython.dll!IronPython.Runtime.PythonGenerator.throw(object type = {"Exception of type 'IronPython.Runtime.Exceptions.GeneratorExitException' was thrown."}, object value = null, object traceback = null) + 0xb5 bytes 
IronPython.dll!IronPython.Runtime.PythonGenerator.throw(object type = {"Exception of type 'IronPython.Runtime.Exceptions.GeneratorExitException' was thrown."}) + 0x2a bytes  
IronPython.dll!IronPython.Runtime.PythonGenerator.close() + 0x56 bytes 
IronPython.dll!IronPython.Runtime.PythonGenerator.Finalize() + 0x42 bytes 

Quelqu'un at-il fait face à un problème similaire? Et quelle est la solution?

EDIT Cela se produit uniquement lorsque le débogueur Visual Studio est connecté.

Répondre

1

Est-ce vraiment une exception non gérée ou êtes-vous simplement voir dans le débogueur? Dans IronPython 2.0 et 2.6, le finaliseur pour les générateurs (ce qui fonctionne ici - voir la méthode Finalize) a un try/catch (Exception) qui avale toutes les exceptions. Ainsi, même si une exception peut être levée sur le thread du finaliseur, elle ne devrait avoir aucun impact sur votre application.

La raison pour laquelle l'exception est levée est que quelqu'un n'a pas itéré sur un générateur tant qu'il n'est pas terminé. La documentation de CPython indique que lorsque le générateur est collecté, il enverra une exception dans le générateur afin de permettre à tous les blocs de fonctionner.

+0

Oui, cela se produit uniquement lorsque le débogueur Visual Studio est connecté. – Rohit

+0

Ok, dans ce cas, il devrait être quelque chose que vous pouvez ignorer en toute sécurité et, espérons-le, ça va disparaître en 2.6. Pour améliorer votre expérience de débogage, vous pouvez configurer VS pour ne pas interrompre GeneratorExitExceptions dans la boîte de dialogue d'exception. –

0

Pas vraiment une réponse (je n'ai pas accès à IronPython ici), mais si vous essayez d'exécuter ce script:

import traceback 
try: 
    import random 
except: 
    traceback.print_exc() 

... il affiche un retraçage niveau Python plutôt qu'un C# un - cela pourrait rendre plus clair ce qui se passe.

(Si sys.stdout n'est pas relié à tout ce que vous capturez, vous pouvez utiliser traceback.format_exc() à la place.)