[Ironruby-core] hosting: howto get the nice ruby backtrace on exception thrown from ruby?

Tomas Matousek Tomas.Matousek at microsoft.com
Wed Feb 18 21:30:25 EST 2009


You can use ExceptionService:

        var engine = Ruby.CreateEngine();
        try {
            engine.Execute(@"
def foo
  goo
end

def goo
  raise 'hello'
end

foo
");
        } catch (Exception e) {
            var exceptionService = engine.GetService<ExceptionOperations>();
            string message, typeName;
            exceptionService.GetExceptionMessage(e, out message, out typeName);
            Console.WriteLine(message);
            Console.WriteLine(typeName);
            Console.WriteLine(exceptionService.FormatException(e));
        }

The current implementation is not ideal. If you're missing some features on the service let us know. We might consider adding them.

Tomas

From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Meinrad Recheis
Sent: Wednesday, February 18, 2009 1:25 AM
To: ironruby-core
Subject: Re: [Ironruby-core] hosting: howto get the nice ruby backtrace on exception thrown from ruby?

I've given it some thought. I would like to avoid wrapping the code in "begin - rescue" and instead catch the exception in c#. Then just send the ruby methods "message" and "backtrace" to the Ruby-exception-object from C#. How would that be done?
Any other hints?
-- Henon
On Tue, Feb 17, 2009 at 11:36 PM, Meinrad Recheis <meinrad.recheis at gmail.com<mailto:meinrad.recheis at gmail.com>> wrote:
hello,

I am now currently using this ugly hack to get a reasonable (let's say user friendly) exception backtrace from an error in executed code:
        public object Execute(string code, ScriptScope scope)
        {
            code = @"begin
_=(
"+code+@"
)
rescue Exception
self.__message__=$!.message.to_clr_string
self.__backtrace__ = $!.backtrace
throw
end";
            object result = null;
            try
            {
                LogManager.GetLogger("Ruby").Debug("\r\n" + code);
                result = m_engine.Execute(code, scope);

            }
            catch (Exception e)
            {
                var backtrace = scope.GetVariable<RubyArray>("__backtrace__");
                string msg = scope.GetVariable<string>("__message__") +"\r\n" + string.Join("\r\n", backtrace.Select(s => s.ToString()).ToArray());

                LogManager.GetLogger("Ruby").Error(msg);
            }
            return result;
        }

Even though it seems to work well I am absolutely not satisfied with it. Is there a better way to do this?
-- henon

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20090218/d1721ee8/attachment.html>


More information about the Ironruby-core mailing list