2011-06-24 24 views
7

Bối rối bằng tiêu đề? Hãy để tôi giải thích: tôi làm thực hiện một kịch bản python, trong một quá trình .NET (# ứng dụng C của tôi là chủ nhà), sử dụng IronPython:Làm thế nào để có được dòng vi phạm khi sử dụng IronPython với C# /. NET làm máy chủ, trên một lỗi thời gian chạy?

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

Mã hiển thị ở trên đang chạy trong một thread nền (sử dụng Task lớp học). Tập lệnh chứa lỗi gây ra một số IronPython.Runtime.Exceptionis.TypeErrorException để bong bóng. Tôi có thể nắm bắt điều này và nhận được tin nhắn.
Nhưng làm thế nào để có được dòng mã hoặc số dòng gây ra ngoại lệ?

Trả lời

8

Bạn có thể gọi PythonOps.GetDynamicStackFrames ngoại lệ và nhận số dòng từ các đối tượng DynamicStackFrame.

+0

Cảm ơn cho giải pháp này. Hoạt động rất tốt! – Marcel

+2

Hoạt động tuyệt vời, cảm ơn. Đối với bất kỳ ai tìm kiếm nó, 'PythonOps' nằm trong' IronPython.Runtime.Operations'. –

5

This answer cung cấp một phương tiện để định dạng một ngoại lệ bắt từ mã IronPython thành một chuỗi chứa thông tin hữu ích hơn như số dòng và cuộc gọi Python stack:

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

Tính năng này cũng hoạt động để biên dịch các lỗi. – tdr

Các vấn đề liên quan