2011-01-19 2 views
1

У меня есть пример кода, который не работает так, как мне кажется.Ловля исключений с объективом-c в Linux

#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 показал мне, что положение улова никогда не достигается. Кажется, что работает Mac.

Почему я не попал в предложение catch?

+0

Возможно, вам нужно запустить 'NSApplication', чтобы запустить объект Objective-C. * возможно * Моя другая мысль состоит в том, что '@ throw' бросает * вверх * стек вызовов? Попробуйте вызвать «нормальное» исключение Objective-C, например '[[NSArray array] objectAtIndex: -1]' или что-то еще. –

+0

Кажется, естественно, что @catch, как ожидается, последует за @try, поэтому я не могу разместить его выше @try в callstack. Я попробовал '@throw [[NSArray array] objectAtIndex: -1]' с '@catch NSArray', но я получил тот же результат. – Steinbitglis

+2

Похоже, что '@ try' не будет работать за пределами [' NSApplication'] (http://www.cocoadev.com/index.pl?ExceptionHandling). Все [код, который я видел] (http://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

Чтобы получить надлежащую Objective-C обработку исключений один, возможно, потребуется скомпилировать с флагом -fobjc-исключений.

> gcc -g -c main.m -fconstant-string-class=NSConstantString -fobjc-exceptions -I/usr/include/GNUstep 
> gcc main.o -lgnustep-base 
> ./a.out 
Смежные вопросы