2011-01-19 16 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

Objective-Cを実行するには、NSApplicationを起動する必要があります。 *多分*私の他の考えは、 '@スローがコールスタックを*上に投げているということです? '[[NSArray array] objectAtIndex:-1]'のような「通常の」Objective-C例外を呼び出してみてください。 –

+0

@cryは@tryに従うと予想されるので、私はcallstackで@tryの上に置くことはできません。 @catch NSArrayを使って '@throw [[NSArray array] objectAtIndex:-1]'を試しましたが、私は同じ結果を得ました。 – Steinbitglis

+2

'' NSApplication'](http://www.cocoadev.com/index.pl?ExceptionHandling)の外で '@ try'が動作しないように見えます。 /developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html#//apple_ref/doc/uid/20000059-BBCHGJIJ)は、プログラムのObjective-C部分内にあるようです、main.mではなく(ほとんど純粋にCです)。 –

答えて

3

の答えは、このメールのスレッドで見つけることができます:http://www.mail-archive.com/[email protected]/msg11979.html

1は-fobjc-例外フラグでコンパイルする必要がある場合があります適切なObjective-Cの例外処理を取得するには。

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