2011-06-24 3 views
7

¿Está confundido por el título? Me explico: hago ejecutar un script en Python, dentro de un proceso de .NET (mi C# aplicación de ser el anfitrión), utilizando IronPython:¿Cómo obtener la línea ofensiva cuando se usa IronPython con C# /. NET como host, en un error de tiempo de ejecución?

ScriptEngine python = Python.CreateEngine(); 
ScriptSource pyFromFileSource = python.CreateScriptSourceFromString(script); 
CompiledCode pyFromFileCode = pyFromFileSource.Compile(); 
ScriptRuntime runtime = engine.Runtime; 
ScriptScope scope = runtime.CreateScope(); //get a scope where we put in the stuff from the host 
scope.SetVariable("lab", this); //allow usage of this class in the script 
script.Execute(scope); 

incluya la palabra clave se está ejecutando en un subproceso en segundo plano (utilizando el Task clase). La secuencia de comandos contiene un error que hace que aumente IronPython.Runtime.Exceptionis.TypeErrorException. Puedo ver esto y recibir el mensaje.
Pero, ¿cómo obtener la línea de script o el número de línea que causa la excepción?

Respuesta

8

Puede llamar a PythonOps.GetDynamicStackFrames en la excepción y obtener los números de línea de los objetos DynamicStackFrame.

+0

Gracias por esta solución. Funciona muy bien! – Marcel

+2

Funciona muy bien, gracias. Para cualquier otra persona que lo busque, 'PythonOps' está en' IronPython.Runtime.Operations'. –

5

This answer proporciona un medio para dar formato a una excepción capturada a partir del código IronPython en una cadena que contiene la información más útil, como números de línea y la pila de llamadas Python:

engine.GetService<ExceptionOperations>().FormatException(exception); 
+0

Esto funciona para errores de compilación también. – tdr

Cuestiones relacionadas