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

Meinrad Recheis meinrad.recheis at gmail.com
Thu Feb 19 04:06:07 EST 2009


Thanks Thomas, thats very good. As for a suggestion about ExceptionService
features: It would be quite useful to retrieve the exception backtrace as
string[] in order to be able format it to one's needs. For instance, I like
using the VisualStudio error parser to be able to jump from the backtrace in
the output right into the right line in the source file (see my blog post:
http://www.eqqon.com/index.php/Navigating_in_Exception_Stack_Traces_in_Visual_C-Sharp).
To do that, currently, I would need to parse the formatted backtrace and
re-format it. No big deal. Just would be nice to have.

Cheers,
-- henon

On Thu, Feb 19, 2009 at 3:30 AM, Tomas Matousek <
Tomas.Matousek at microsoft.com> wrote:

>  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, outtypeName);
>
>             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> 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
>
>
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20090219/f6374294/attachment-0001.html>


More information about the Ironruby-core mailing list