2009-03-05 14 views
6

Estoy incorporando IronPython 2.0 en C#. En IronPython, definí mi propia excepción con:Captura de excepción de Ironpython en C#

def foobarException(Exception): 
    pass 

y elevarla en algún lugar con:

raise foobarException("This is the Exception Message") 

Ahora en C#, que 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" 
} 
+0

¿Has probado eso con un depurador? Debería ver el tipo de excepción o la excepción interna, o dondequiera que esté almacenada la excepción de python real. – OregonGhost

+0

sí, lo intenté con un depurador, pero no pude encontrarlo. La cuestión es que funcionó con IronPython 1.1. Cuando recuerdo correctamente en e.Data ["PythonExceptionInfo"], en realidad había el mensaje python exception.message. Y en e.Message estaba el nombre de la Excepción. – foobar

Respuesta

1

Mi solución final fue:

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

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

Suponiendo que se ha compilado su código 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), debe hacer referencia al ensamblado que contiene su código python en su proyecto y desenterrar el tipo foobarException en algún espacio de nombre python. De esa forma, C# podrá escribir coincidencias con esa excepción. Esta es la única forma en que puedes hacer eso correctamente.

3

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

type(e).__name__ 

Si desea que el tipo de excepción .NET, asegúrese de que tiene import clr en el módulo. Hace que los atributos .NET estén disponibles en los objetos, como el método ToUpper() en cadenas. A continuación, puede acceder a la excepción de .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 agarrar la excepción específica .NET que desea:

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

Cuando capte una excepción de IronPython de C#, puede usar el motor de Python para formatear la traceback:

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

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

+0

FormatException solo es útil para SyntaxErrorException, solo regurgita Exception.Message para cualquier otro. – Tergiver

Cuestiones relacionadas