2011-01-19 26 views
1

我有一些示例代碼不按我認爲應該的方式運行。在Linux中使用objective-c捕獲異常

#import <Foundation/NSString.h> 
#import <Foundation/NSException.h> 
#import <Foundation/NSAutoreleasePool.h> 
#import <stdio.h> 

int main(int argc, const char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    @try { 
    NSException *e = [NSException 
     exceptionWithName: @"NSException" 
       reason: @"The level is below 0" 
       userInfo: nil]; 
    @throw e; 
    } @catch (NSException *e) { 
    printf("+%s: ", [[e name] UTF8String]); 
    } 

    [pool release]; 
} 

我運行如下:

> gcc -g -c main.m -fconstant-string-class=NSConstantString -I/usr/include/GNUstep 
> gcc main.o -lgnustep-base 
> ./a.out 

結果是:

Aborted 

與GNU調試打一點點向我表明的catch子句從未達到。它似乎工作mac雖然。

爲什麼我不進入catch子句?

+0

您可能需要啓動'NSApplication`才能運行Objective-C的東西。 *也許*我的另一個想法是`@ throw`正在向上調用堆棧?嘗試調用「正常」Objective-C異常,如`[[NSArray array] objectAtIndex:-1]`或其他。 – 2011-01-19 15:17:51

回答

3

所需的答案都可以在此郵件主題中找到:http://www.mail-archive.com/[email protected]/msg11979.html

爲了得到正確的Objective-C的異常處理一個可能需要與-fobjc-exceptions標誌進行編譯。

> gcc -g -c main.m -fconstant-string-class=NSConstantString -fobjc-exceptions -I/usr/include/GNUstep 
> gcc main.o -lgnustep-base 
> ./a.out