2011-06-24 7 views
7

Zmieszany z tytułem? Pozwól mi wyjaśnić: zrobić wykonać skrypt Pythona, w ramach procesu .NET (mój aplikacji C# jako gospodarz), przy użyciu IronPython:Jak uzyskać linię naruszającą prawa podczas używania IronPython z C#/.NET jako hostem, na błąd runtime?

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); 

kod pokazany powyżej jest uruchomiony w wątku tła (przy użyciu Task klasa). Skrypt zawiera błąd, który powoduje bańkę. Mogę to złapać i dostać wiadomość.
Ale jak uzyskać wiersz skryptu lub numer linii, który powoduje wyjątek?

Odpowiedz

8

Możesz wywołać PythonOps.GetDynamicStackFrames na wyjątku i uzyskać numery linii z obiektów DynamicStackFrame.

+0

Dzięki za tym rozwiązaniem. Działa bardzo dobrze! – Marcel

+2

Działa świetnie, dzięki. Dla każdego, kto tego szuka, 'PythonOps' jest w' IronPython.Runtime.Operations'. –

5

This answer zapewnia środki do formatowania wyjątek złowionych z kodu IronPython w ciąg, który zawiera więcej przydatnych informacji, takich jak numery linii i stos wywołań Python:

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

Działa to również w przypadku błędów kompilacji. – tdr

Powiązane problemy