2011-01-19 2 views
1

필자는 생각했던 방식으로 실행되지 않는 샘플 코드가 있습니다.Linux에서 objective-c를 사용하여 예외 catch

#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 

결과는 다음과 같습니다

는 GNU 디버거와 함께 재생 조금 나를 보여
Aborted 

캐치 절에 도달하지 못했다된다. 그것은 맥을 작동하는 것 같다.

왜 catch 절에 들어 가지 않습니까? 필요

+0

Objective-C를 실행하려면 'NSApplication'을 시작해야 할 수도 있습니다. * 아마 * 다른 생각은'@ throw'가 호출 스택을 던지고 있다는 것입니까? '[[NSArray array] objectAtIndex : -1] 또는 무엇인가와 같은 "일반적인"Objective-C 예외를 호출 해보십시오. –

+0

@cry는 @try를 따라야하는 것으로 자연스럽게 보입니다. 따라서 callstack에서 @try 위에 놓을 수는 없습니다. @catch NSArray와 함께'@throw [[NSArray array] objectAtIndex : -1]'을 시도했지만 같은 결과를 얻었습니다. – Steinbitglis

+2

''@Apply '는 ['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

하나가 -fobjc - 예외 플래그로 컴파일해야 할 수도 있습니다 처리 적절한 목표 - C 예외를 얻을 수 있습니다.

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