2012-02-17 5 views
2

IronRubyスクリプトを実行するためのC#プログラムがあります。しかしそれをする前に、最初にファイルをコンパイルしてエラーがないかどうか確認したいと思います。しかし、それはErrorListenerがうまくいかないようです。私のコードに何か問題はありますか?IronRubyのErrorListenerの使用方法

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      ScriptEngine engine = null; 
      engine = Ruby.CreateEngine(); 

      ScriptSource sc = engine.CreateScriptSourceFromFile("MainForm.rb"); 
      ErrorListener errLis = new MyErrorListener(); 
      sc.Compile(errLis); 
    } 
} 

class MyErrorListener : ErrorListener 
{ 
    public override void ErrorReported(ScriptSource source, string message, Microsoft.Scripting.SourceSpan span, int errorCode, Microsoft.Scripting.Severity severity) 
    { 
     Console.WriteLine(message); 
    } 
} 

Rubyのファイル:

require "mscorlib" 
require "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
require "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 

include System::Windows::Forms 
dfasdf error here 
class MainForm < Form 
def initialize() 
    self.InitializeComponent() 
end 

def InitializeComponent() 
    # 
    # MainForm 
    # 
    self.Name = "MainForm" 
    self.Text = "HelloRubyWin" 
end 
end 
+0

これを解決しましたか? – ashes999

答えて

1

あなたが何をしようとしては、実際には動作しないようです。しかし、それがバグかどうか分からない。

これを回避するには、try/catchブロック内でコードを実行し、MissingMethodExecptionを探します。 IronRuby(またはその他の動的言語)が実際に実行するまで「ネスト」コードで何もしないため、構文エラーがメソッド内部にある場合は、これも役立たないことに注意してください。

一般的に、私はあなたがしようとしているものから多くの価値を得ることはないと思います。

のtry/catchコードサンプル:私はこの問題について研究

ScriptEngine engine = null; 
engine = Ruby.CreateEngine(x => { x.ExceptionDetail = true; });   

ScriptSource sc = engine.CreateScriptSourceFromFile("MainForm.rb"); 
ErrorListener errLis = new MyErrorListener(); 
sc.Compile(errLis); 

try 
{ 
    dynamic d = sc.Execute(); 
} 
catch (MissingMethodException e) 
{ 
    Console.WriteLine("Syntax error!"); 
} 
+0

これはIronRuby 1.13(NuGet上の最新版)を使って私にとってはうまくいかないようです。 'MyErrorListener.ErrorReported'関数は決して起動しません。 – ashes999

0

は最終的に最初のマネージャを、次のあなたは、ErrorListenerクラスを記述している解決策を見つけました。

public class IronRubyErrors : ErrorListener 
{ 
    public string Message { get; set; } 
    public int ErrorCode { get; set; } 
    public Severity sev { get; set; } 
    public SourceSpan Span { get; set; } 
    public override void ErrorReported(ScriptSource source, string message, Microsoft.Scripting.SourceSpan span, int errorCode, Microsoft.Scripting.Severity severity) 
    { 
     Message = message; 
     ErrorCode = errorCode; 
     sev = severity; 
     Span = span; 
    } 
} 

その後、

var rubyEngine = Ruby.CreateEngine(); 
ScriptSource src = rubyEngine.CreateScriptSourceFromFile("test.rb"); 
IronRubyErrors error = new IronRubyErrors(); 
src.Compile(error); 
if (error.ErrorCode != 0) 
{ 
    MessageBox.Show(string.Format("Discription {0} \r\nError at Line No.{1} and Column No{2}", error.Message, error.span.Start.Line, error.span.Start.Column)); 
} 

try 
{ 
    if (error.ErrorCode == 0) 
    { 
     var res = src.Execute(); 
    } 
} 
catch (MissingMethodException ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

IronRubyのはDLRであるので、したがって、それは次のようにIronRubyののキーワードでない文字場合( `、〜、^など)ランタイムでコンパイルするか、いずれかの構文を作成しましたError他の場合、ScriptSourceのコンパイルメソッドでErrorがキャプチャされ、ErrorListenerクラスのオブジェクトが埋められ、Rubyライブラリで定義されていないメソッドを使用した場合はErrorCodeなどが見つかります。たとえば、Number Conversionこのように

それはMissingMethodExceptionブロックでキャッチされ、その後修正されていない210

正しい方法は

@abc.to_f 

であり、あなたは、その後、これらの(ゼロ例外除算などの)他のエラーを得た場合にキャッチされています例外ブロック内