Attraper une exception Ironpython en C #
-
03-07-2019 - |
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"
}
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.