[MacRuby-devel] TIL - Uncaught exceptions in threads cause SIGABRT in the main thread!

Matt Massicotte massicotte at apple.com
Mon Mar 14 10:44:40 PDT 2011


On Mar 14, 2011, at 10:35 AM, Morgan Schweers wrote:

> Greetings,
> 
> On Mon, Mar 14, 2011 at 6:57 AM, Matt Massicotte <massicotte at apple.com> wrote:
> If you find this exception-shifting behavior troubling, please open a ticket.
> 
> What bugs me about the behavior in this case is that if the exact same operation is done on the main thread, it throws a very nice, normal Ruby exception trace, and I know immediately what boneheaded move I made. :)  If it happens on an NSThread, it gives an absolutely opaque 'SIGABRT' on the main thread.
> 
> I'll see if I can create a simple example that demonstrates it.

That would be great.  This behavior is not macruby-specific, but bites anyone that sees exceptions on non-main threads.

> 
> Could you explain why introducing the begin/rescue pair that is good programming practice?
> 
> Historically I've found that when I have a consumer thread that does 'work', I don't want an unanticipated failure of any one work unit to prevent future work units from being processed.  So at the top level of any thread action (in this case, in the method triggered on NSTimer firing) I wrap the work-processing code in a rescue block, so if an unexpected failure happens, I log it, and move on to the next work unit.  In some (most?) systems an uncaught exception will kill off the thread, and apparently something similar is true in MacRuby.

Ah.  Yes, in the special-case of executing work that has zero side-effects on the rest of your system, this can be helpful.

> 
> Matt
> 
> Hope that helps.
> 
> --  Morgan Schweers
> 
> On Mar 13, 2011, at 6:31 PM, Morgan Schweers wrote:
> 
>> Greetings,
>> Today I Learned :) if a thread throws an exception that isn't rescued by the top of the thread, it'll crash the app's main thread with 'Program received signal:  “SIGABRT”.'
>> 
>> That's been plaguing me since I started doing MacRuby development; every time I tried to start up multiple threads, the app became incredibly fragile and, unlike the main thread, it wouldn't show ruby traces.
>> 
>> Now I just wrap threads in begin/rescue blocks, and I'm all good.  Good programming practice anyway, but the failure mode is unobvious if you don't.
>> 
>> Hopefully this helps someone else!
>> 
>> --  Morgan
>> 
>> _______________________________________________
>> MacRuby-devel mailing list
>> MacRuby-devel at lists.macosforge.org
>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
> 
> 
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
> 
> 
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-devel/attachments/20110314/1d7ea347/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3737 bytes
Desc: not available
URL: <http://lists.macosforge.org/pipermail/macruby-devel/attachments/20110314/1d7ea347/attachment.bin>


More information about the MacRuby-devel mailing list