[Ironruby-core] Handling runtime errors in embedded applications
Jimmy Schementi
Jimmy.Schementi at microsoft.com
Tue Dec 29 10:50:04 EST 2009
Oh really? Is there any way to get a to the dynamic stack trace info
without parsing it yourself?
~Jimmy
On Dec 29, 2009, at 12:51 AM, "Tomas Matousek" <Tomas.Matousek at microsoft.com
> wrote:
> ScriptingRuntimeHelpers.GetDynamicStackFrames does not work for
> IronRuby frames though, only Python is using this technique of stack
> tracing.
>
> Tomas
>
> -----Original Message-----
> From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-
> bounces at rubyforge.org] On Behalf Of Jimmy Schementi
> Sent: Tuesday, December 29, 2009 3:27 AM
> To: ironruby-core at rubyforge.org
> Subject: Re: [Ironruby-core] Handling runtime errors in embedded
> applications
>
> James,
>
> To be up-front, your requirements are all possible with IronRuby.
>
> For syntax errors, you're doing the right thing by using
> ScriptSource.Compile(ErrorListener).
>
> For runtime errors, this gets trickier since all IronRuby runtime
> errors are also actual CLR exceptions, so you need to depend on the
> CLR's exception catching mechanisms to detect runtime errors and
> have your application react accordingly. While using try/catch is
> one way to simply capture exceptions, as you say, it doesn't cover
> all cases like catching exceptions from other threads. To solve
> this, you can hook the CLR's ApplicationUnhandedException event to
> catch all exceptions from code executing in an AppDomain:
>
> public static void Main() {
> AppDomain currentDomain = AppDomain.CurrentDomain;
> currentDomain.UnhandledException += new
> UnhandledExceptionEventHandler(MyHandler);
> try {
> throw new Exception("1");
> } catch (Exception e) {
> Console.WriteLine("Catch clause caught : " + e.Message);
> }
> throw new Exception("2");
> // Output:
> // Catch clause caught : 1
> // MyHandler caught : 2
> }
> static void MyHandler(object sender, UnhandledExceptionEventArgs
> args) {
> Exception e = (Exception) args.ExceptionObject;
> Console.WriteLine("MyHandler caught : " + e.Message);
> }
>
> AppDomain.UnhandedException documentation: http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx
> .
>
> Now that you have a reliable way of capturing the actual exception
> object, you need to do something useful with it. Rather than using
> RubyExceptionData, it's preferred to use the DLR hosting API:
> "ScriptEngine.GetService<ExceptionOperations>()". This gives you a
> ExceptionOperations type, which you can use to format an exception
> as the language defines.
>
> However, it sounds like you'd rather get a list of stack frames to
> iterate through, and get information about the frame, rather than
> just a stacktrace string. You can get the actual dynamic stack
> frames with ScriptingRuntimeHelpers.GetDynamicStackFrames
> (exception), which will give you a DynamicStackFrame[] to iterate
> through, and pull out filenames, line numbers, and method names,
> without resorting to a regex.
>
> Does that answer all your questions?
>
> ~Jimmy
> ________________________________________
> From: ironruby-core-bounces at rubyforge.org [ironruby-core-
> bounces at rubyforge.org] on behalf of James Leskovar [lists at ruby-
> forum.com]
> Sent: Saturday, December 26, 2009 3:12 AM
> To: ironruby-core at rubyforge.org
> Subject: [Ironruby-core] Handling runtime errors in embedded
> applications
>
> Hi there,
>
> So my application is basically a lightweight IDE for IronRuby, built
> in C#, with the idea that users should be able to quickly edit and
> prototype ruby scripts. Part of the application's requirements is to
> have the ability to handle compilation/syntax errors and runtime
> exceptions, as well as the ability to 'jump to' the source of errors.
>
> At the moment, I'm wrapping CreateScriptSourceFromFile, Compile and
> Execute within a try/catch. Syntax errors are easily handled with a
> custom ErrorListener passed into ScriptSource.Compile. Handling
> runtime errors though are a little bit more tricky; the easiest way
> I've found so far involves RubyExceptionData.GetInstance and a linq
> expression to parse the backtrace with regexes. Not the most elegant
> solution, but it works.
>
> However, one area where this method falls flat is when the error
> occurs in a thread created within the script itself; execution is
> now outside the try/catch, so I'm not able to catch the Exception
> object.
> Futhermore, nothing seems to happen when the error does occur;
> nothing gets written to the errorstream, nor is there any indication
> of any error. It seems like the only way to handle these thread
> errors is to do it within the script using a begin-rescue block.
>
> My question is, is there an easier way to get runtime error
> information other than RubyExceptionData? Additionally, what is the
> best way to handle errors when they occur in a thread other than the
> one which calls Execute()? It would be handy to be able to set some
> sort of global 'ErrorListener', or perhaps have the ability to pass
> in such an object to the call to Execute.
>
> Kind regards,
> James
> --
> Posted via http://www.ruby-forum.com/.
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
More information about the Ironruby-core
mailing list