У меня есть пример кода, который не работает так, как мне кажется.Ловля исключений с объективом-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?
Возможно, вам нужно запустить 'NSApplication', чтобы запустить объект Objective-C. * возможно * Моя другая мысль состоит в том, что '@ throw' бросает * вверх * стек вызовов? Попробуйте вызвать «нормальное» исключение Objective-C, например '[[NSArray array] objectAtIndex: -1]' или что-то еще. –
Кажется, естественно, что @catch, как ожидается, последует за @try, поэтому я не могу разместить его выше @try в callstack. Я попробовал '@throw [[NSArray array] objectAtIndex: -1]' с '@catch NSArray', но я получил тот же результат. – Steinbitglis
Похоже, что '@ 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). –