Я исследовал эту проблему и, наконец, нашел решение, которое сначала напишет ваш класс ErrorListener в следующем Manger.
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, он компилируется в RunTime, если символы, не являющиеся ключевыми словами IronRuby, такие как (~, `, ^ и т. Д.) ИЛИ вы создали любую синтаксическую ошибку, кроме Error, будет зафиксирована в методе компиляции ScriptSource и объект класса ErrorListener будет заполнен, и мы найдем ErrorCode и т. д., если вы использовали метод, который не определен в библиотеке Ruby, например, вы ввели метод для преобразования чисел, например,
@abc.to_
, что неверно, тогда оно будет перехвачено в блоке MissingMethodException
Правильный метод
@abc.to_f
и если вы получили ошибку «Другое», то это (например, «Делить на исключение нуля»), то это будет зафиксировано в блоке исключений