Pregunta

Estoy incrustando IronPython 2.0 en C #. En IronPython, definí mi propia excepción con:

def foobarException(Exception):
    pass 

y levántalo en algún lugar con:

raise foobarException( "This is the Exception Message" )

Ahora en C #, tengo:

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"
}
¿Fue útil?

Solución 3

Mi solución final fue:

Tengo una clase de resultado en C # que se pasa a mi código ironpython. En Ironpython lleno la clase de resultados con todos mis valores calculados. A esta clase acabo de agregar una variable miembro IronPythonExceptionName. Ahora solo tengo una prueba simple en IronPython:

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

Otros consejos

Cuando atrapas una excepción IronPython de C #, puedes usar el motor Python para formatear el rastreo:

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

Puedes sacar el nombre de la excepción del rastreo. De lo contrario, tendrá que llamar a la API de hosting de IronPython para recuperar información directamente desde la instancia de excepción. engine.Operations tiene métodos útiles para este tipo de interacciones.

La forma en que IronPython asigna las excepciones de .NET a Python no siempre es sencilla; se informan muchas excepciones como SystemError (aunque si importa el tipo de excepción .NET puede especificarlo en la cláusula except ). Puede obtener el tipo de Python de la excepción utilizando

type(e).__name__

Si desea el tipo de excepción .NET, asegúrese de tener import clr en el módulo. Hace que los atributos .NET estén disponibles en objetos, como el método ToUpper () en cadenas. Luego puede acceder a la excepción .NET utilizando el atributo .clsException :

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

impresiones:

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

Un ejemplo de captura de la excepción .NET específica que desea:

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

Suponiendo que compiló su código de Python con el compilador equivalente .NET, tendría un tipo estático que es solo esa excepción. Si esta excepción es pública (tipo exportado), usted hace referencia al ensamblaje que contiene su código de python en su proyecto y extrae el tipo foobarException en algún espacio de nombres de python. De esa forma, C # podrá escribir match esa excepción. Esta es la única forma en que puede hacerlo correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top