2017-01-16 3 views
0

Ich habe Probleme mit UI, die Benutzer einfachen Ausdruck der zugrunde liegenden Daten eingeben können, um einige angepasste Ausgabe mit IronPython zu erhalten.So erhalten Sie detaillierte Fehlerort (Zeichenstandort) in einem single line python Ausdruck

Was ich getan habe ...

using System; 
using IronPython.Hosting; 

namespace SimpleTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var engine = Python.CreateEngine(); 
     var scope = engine.CreateScope(); 
     scope.SetVariable("a", new Person("A", 18)); 
     scope.SetVariable("b", new Person("B", 24)); 
     object result = null; 
     try 
     { 
      //result = engine.Execute<object>("a.Age + b.Age", scope); 
      result = engine.Execute<object>("a.Age + b.Grade", scope); 
     } 
     catch (Exception e) 
     { 
      // Error Message : 'Person' object has no attribute 'Grade' 
      // TODO HOW TO GET Character Span Location? 
      Console.WriteLine(e); 
     } 
     Console.WriteLine("Result:{0}", result); 
    } 
} 

public class Person 
{ 
    public string Name { get; private set; } 
    public double Age { get; private set; } 

    public Person(string name, double age) 
    { 
     Name = name; 
     Age = age; 
    } 
} 
} 

Wie Sie den Ausdruck in engine.Execute<object> weitergegeben sehen kann, ist ungültig, weil es keine Grade Stütze in der Klasse ist, so dass der Motor wirft Ausnahme wie erwartet, aber es nicht enthält Irgendwelche Informationen über den Ort des Charakters von Text, der dem Benutzer mit einer hervorragenden Farbe wie Rot angezeigt werden kann.

Irgendein Hinweis, das zu tun?

Ich googelte, aber keine Antwort dafür gefunden. Nur was ich gefunden habe, ist die Anzeige der Zeilennummer in den Dateinameninformationen.

Dank

Antwort

1

Sie können die Data Eigenschaft der Ausnahme überprüfen Sie die Zeile Informationen zu erhalten. Die Eigenschaft Data enthält ein Wörterbuch, das nach Typobjekten codiert ist, die die Objekte darstellen, die Sie untersuchen möchten.

Sie möchten die InterpretedFrameInfo aus den Daten erhalten. Es ist als eine Sammlung von InterpretedFrameInfo Objekte gegeben. Sie sind im Wesentlichen der Stack-Trace innerhalb des Skripts, wenn es fehlgeschlagen ist. Die DebugInfo enthält die gewünschten Informationen. Sie können auch die DynamicStackFrame überprüfen, um den tatsächlichen Inhalt der Frames zu überprüfen. Sie können auf jede Sammlung als IReadOnlyList zugreifen.

if (e.Data[typeof(Microsoft.Scripting.Interpreter.InterpretedFrameInfo)] 
     is IReadOnlyList<Microsoft.Scripting.Interpreter.InterpretedFrameInfo> trace) 
{ 
    // do stuff with trace 
} 

if (e.Data[typeof(Microsoft.Scripting.Runtime.DynamicStackFrame)] 
     is IReadOnlyList<Microsoft.Scripting.Runtime.DynamicStackFrame> frames) 
{ 
    // do stuff with frames 
} 

Denken Sie daran, dass es scheint, dass es einige Bootstrap-Code in den Skripten injiziert ist, so dass die Index im Rahmen könnte ausgeschaltet sein. In meinem Fall sehe ich einen Offset von 23 für einen einfachen Ausdruck.

+0

Ich habe den gleichen Wert von 'offset' (?) 23, aber verstehe nicht, was die Bedeutung davon ist und wie man die exakte Zeichenspanne (Zeichenindexbereich der gegebenen Python-Ausdruckszeichenfolge) extrahiert. Gibt es noch einen Hinweis? – Joonhwan

+0

Ehrlich gesagt, ich weiß nicht, was die 'Index'-Eigenschaft genau bedeuten könnte. Zuerst dachte ich, es sei nur der Offset in die Datei, dass die genaue Position auftritt. Zeilennummern können immer mithilfe von Compiler-Direktiven angepasst werden, sofern sie unterstützt werden. Ich habe keinen anderen Grund, etwas anderes zu glauben. –

Verwandte Themen