Frage

Ich bin das Einbetten von Ironpython 2.0 in C #. In Ironpython, ich meine eigene Ausnahme definiert mit:

def foobarException(Exception):
    pass 

und hebt es irgendwo mit:

raise foobarException( "This is the Exception Message" )

Jetzt in C #, ich habe:

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"
}
War es hilfreich?

Lösung 3

Meine letzte Lösung war:

Ich habe ein Ergebnis Klasse in C #, die zu meinem Code Ironpython übergeben wird. In Ironpython fülle ich das Ergebnis Klasse mit allen meinen berechneten Werten. Zu dieser Klasse habe ich nur noch eine Membervariable IronPythonExceptionName. Jetzt habe ich nur einen einfachen Versuch in Ironpython:

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

Andere Tipps

Wenn Sie eine Ausnahme von Ironpython C # fangen, können Sie den Python-Engine verwenden, um die Rückverfolgung zu formatieren:

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

Sie können die Ausnahme-Namen aus dem Zurückverfolgungs ziehen. Andernfalls werden Sie in die Ironpython-Hosting-API aufrufen müssen, um Informationen direkt aus dem Ausnahme-Instanz abzurufen. engine.Operations hat nützliche Methoden für diese Art von Wechselwirkungen.

Die Art und Weise .NET Ausnahmen Ironpython Karten zu Python diejenigen, ist nicht immer einfach; viele Ausnahmen werden als SystemError berichtet (obwohl, wenn Sie .NET Ausnahmetyp importieren Sie, dass in der except Klausel angeben). Sie können den Python Typen der Ausnahme erhalten mit

type(e).__name__

Wenn Sie .NET Ausnahmetyp möchten, stellen Sie sicher, dass Sie in dem Modul import clr haben. Es macht .NET auf Objekte, wie die ToUpper() Methode auf Strings verfügbaren Attribute. Dann können Sie die .NET Ausnahme Zugriff auf das .clsException Attribut:

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

druckt:

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

Ein Beispiel für die spezifische .NET Ausnahme fangen Sie:

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

Unter der Annahme, dass Sie Ihre Python-Code mit dem .NET-Äquivalent-Compiler kompiliert Sie eine statische Art haben würde, die nur die Ausnahme. Wenn diese Ausnahme ist öffentlich (exportierte Typ), dann verweisen Sie auf die Assembly, die Ihren Python-Code in einem Projekt enthält und die Art foobarException in einigem Python-Namespace raben. Auf diese Weise C # wird in der Lage sein, diese Ausnahme zu geben entsprechen. Dies ist der einzige Weg, dass richtig tun können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top