[MacRuby] #1199: Original Objective-C exceptions are lost when going through Ruby code.

MacRuby ruby-noreply at macosforge.org
Wed Mar 16 02:36:30 PDT 2011


#1199: Original Objective-C exceptions are lost when going through Ruby code.
-------------------------------------+--------------------------------------
 Reporter:  eloy.de.enige@…          |       Owner:  lsansonetti@…        
     Type:  defect                   |      Status:  new                  
 Priority:  blocker                  |   Milestone:                       
Component:  MacRuby                  |    Keywords:                       
-------------------------------------+--------------------------------------
 Currently MacRuby will transform Objective-C exceptions into a Ruby
 RuntimeError and convert Ruby exceptions into Objective-C NSException
 instances. This means that you can't rescue an objc exception and re-raise
 it and expect the objc code to still be able to handle it. A discussion
 about this has lead to the conclusion that we should try to make Ruby
 exceptions inherit from NSException and no longer transform exceptions.

 Example code:

 {{{
 $ cat test.m
 #import <Foundation/Foundation.h>

 void Init_test() {};

 @interface MyError : NSException
 @end

 @implementation MyError
 @end


 @interface Test : NSObject
 @end

 @implementation Test

 - (void)raiseException {
   MyError *e = [[MyError alloc] initWithName:@"MyError" reason:@"Because I
 can" userInfo:nil];
   @throw e;
 }

 - (void)callBlock:(id)block {
   @try {
     [block performSelector:@selector(call)];
   }
   @catch(NSException *e) {
     NSLog(@"Exception class: %@, name: %@, reason: %@", [e class], [e
 name], [e reason]);
   }
 }

 @end

 $ cat test.rb
 require 'test.bundle'

 test = Test.new
 test.callBlock(proc {
   begin
     test.raiseException
   rescue Object => e
     p e
     raise e
   end
 })

 $ gcc -o test.bundle -fobjc-gc -flat_namespace -undefined suppress -bundle
 -framework Foundation test.m
 }}}

 Current behavior:

 {{{
 % macruby test.rb
 #<RuntimeError: MyError: Because I can>
 2011-03-16 10:26:58.517 macruby[53938:903] Exception class: NSException,
 name: RuntimeError, reason: /Users/eloy/tmp/macruby-exception-
 ticket/test.rb:9:in `block': MyError: Because I can (RuntimeError)
         from /Users/eloy/tmp/macruby-exception-ticket/test.rb:4:in
 `<main>'
 }}}

 Expected behavior (as can be seen with attached naive patch):

 {{{
 % macruby test.rb
 #<RuntimeError: MyError: Because I can>
 2011-03-16 10:30:16.304 macruby[60162:903] Exception class: MyError, name:
 MyError, reason: Because I can
 }}}

-- 
Ticket URL: <http://www.macruby.org/trac/ticket/1199>
MacRuby <http://macruby.org/>



More information about the macruby-tickets mailing list