Question

J'intègre IronPython 2.0 en C #. Dans IronPython, j'ai défini ma propre exception avec:

def foobarException(Exception):
    pass 

et élevez-le quelque part avec:

raise foobarException( "This is the Exception Message" )

Maintenant en C #, j'ai:

try
{
   callIronPython();
}
catch (Exception e)
{
   // How can I determine the name (foobarException) of the Exception
   // that is thrown from IronPython?   
   // With e.Message, I get "This is the Exception Message"
}
Était-ce utile?

La solution 3

Ma dernière solution était:

J'ai une classe de résultats en C # qui est transmise à mon code ironpython. Dans Ironpython, je remplis la classe de résultats avec toutes mes valeurs calculées. À cette classe, je viens d'ajouter une variable membre IronPythonExceptionName. Maintenant, je viens d'essayer simplement IronPython:

try: 
    complicatedIronPythonFunction()
except Exception, inst:
    result.IronPythonExceptionName = inst.__class__.__name__
    raise inst

Autres conseils

Lorsque vous attrapez une exception IronPython de C #, vous pouvez utiliser le moteur Python pour formater le suivi:

catch (Exception e)
{
    ExceptionOperations eo = _engine.GetService<ExceptionOperations>(); 
    string error = eo.FormatException(e); 
    Console.WriteLine(error);
}

Vous pouvez extraire le nom de l'exception de la trace. Sinon, vous devrez faire appel à l'API d'hébergement IronPython pour extraire des informations directement à partir de l'instance de l'exception. engine.Operations contient des méthodes utiles pour ce type d'interactions.

La façon dont IronPython mappe les exceptions .NET à celles Python n’est pas toujours simple; de nombreuses exceptions sont signalées sous la forme SystemError (toutefois, si vous importez le type d'exception .NET, vous pouvez le spécifier dans la clause except ). Vous pouvez obtenir le type Python de l’exception en utilisant

type(e).__name__

Si vous souhaitez le type d'exception .NET, assurez-vous que import clr est présent dans le module. Il rend les attributs .NET disponibles sur les objets, comme la méthode ToUpper () sur les chaînes. Vous pouvez ensuite accéder à l'exception .NET à l'aide de l'attribut .clsException :

import clr
try:
    1/0
except Exception, e:
    print type(e).__name__
    print type(e.clsException).__name__

imprime:

ZeroDivisionError      # the python exception
DivideByZeroException  # the corresponding .NET exception

Exemple d'attrapage de l'exception .NET spécifique souhaitée:

from System import DivideByZeroException
try:
    1/0
except DivideByZeroException:
    print 'caught'

En supposant que vous ayez compilé votre code python avec le compilateur équivalent .NET, vous auriez un type statique qui ne serait que cette exception. Si cette exception est publique (type exporté), vous référencez alors l'assembly qui contient votre code python dans votre projet et extrayez le type foobarException dans un espace de noms python. De cette façon, C # pourra taper correspondant à cette exception. C’est le seul moyen de le faire correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top