2017-01-16 4 views
0

IronPythonを使用してカスタマイズされた出力を得るために、基になるデータの簡単な式をユーザーが入力できます。sinle lineで詳細なエラー位置(文字の位置)を取得する方法Pythonの式

私が何をしたか

...

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

期待通りにエンジンが例外をスローしますが、それは含まれていないように、あなたは、クラスにはGrade小道具がないためengine.Execute<object>に渡された式が無効である見ることができるように赤のような目立つ色でユーザーに見せるのがよいテキストの文字位置に関する情報。

これを行うためのヒント?

私はグーグルだが、これに対する回答は見つかりませんでした。私が見つけたのは、ファイル名情報に行番号を表示することだけでした。

おかげ

答えて

1

あなたはラインの情報を得るために、例外のData性質を調べることができます。 Dataプロパティには、検査するオブジェクトを表す型オブジェクトによってキーが付けられた辞書が含まれています。

データからInterpretedFrameInfoを取得する必要があります。それはInterpretedFrameInfoオブジェクトのコレクションとして与えられています。基本的には、失敗したときのスクリプト内のスタックトレースです。 DebugInfoには、必要な情報が含まれます。 DynamicStackFrameを調べて、フレームの実際の内容を検査することもできます。各コレクションにはIReadOnlyListとしてアクセスできます。

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 
} 

ちょうどスクリプトに注入され、いくつかのブートストラップコードがあるので、フレーム内Indexがオフになるかもしれないと思われることに注意してください。私の場合は、単純な式のためにオフセットが23になっています。

+0

私は 'offset'(?)23と同じ値を持っていますが、その意味と正確な文字のスパン(与えられたPythonの式文字列の文字インデックスの範囲)を抽出する方法を理解していません。 これ以上のヒントはありますか? – Joonhwan

+0

正直なところ、私は 'Index'プロパティが正確に何を意味するのか分かりません。最初は、ファイルへのオフセットだけで、正確な位置が発生したと思いました。ライン番号は、コンパイラ指令がサポートされていれば、常に調整することができます。私はそうでなければ信じる理由はない。 –

関連する問題