2010-06-30 4 views
3

EDIT : 문제가 해결되었습니다 (부분적으로) : 시뮬레이터 버그입니다. 필자는 iOS 3.1.3 및 4.0을 사용하는 두 대의 장치에서이를 컴파일하고 테스트했습니다. 예외가 올바르게 처리되었습니다. 조심하십시오, 시뮬레이터는 적입니다!objective-c 및 xcode에서 예외 처리를 활성화하는 방법

이것은 나를 미치게합니다. 내 프로젝트에서 예외 처리를 활성화하는 방법을 모르겠습니다. 아래의 코드 및 디버거 출력을보십시오.

내 목표는 예외를 처리하고 예외를 처리하고 앱이 충돌하지 않도록 코드를 수정하지 않고 예외를 잡는 것입니다.

저는 Xcode 3.2.3, iPhone SDK 4 final을 사용하고 있습니다. 방금 iPhone App을 기반으로 간단한보기를 만들었습니다.

프로젝트 설정을 살펴본 결과 "Objective-C 예외 사용"스위치가 선택되었습니다. 나는 GCC 4.2를 사용하고있다.

빌드 프로세스를 자세히 살펴보면 컴파일러 플래그 -fno-objc-exceptions가 인수 목록에 없습니다!

무엇이 여기에 있습니까? 사전에

덕분에 닉

NSArray * foo = [[NSArray alloc] init]; 

@try { 
    NSLog(@"trying..."); 
    [foo objectForKey:@"yeah"]; 
} 
@catch (NSException * e) { 
    NSLog(@"catching %@ reason %@", [e name], [e reason]); 
} 
@finally { 
    NSLog(@"finally"); 
} 

는 캐치이나 finally 블록 이제까지 도달 여부

trying... 

-[__NSArrayI objectForKey:]: unrecognized selector sent to instance 0x5d5f780 

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI objectForKey:]: unrecognized selector sent to instance 0x5d5f780' 

*** Call stack at first throw: 
(
0 CoreFoundation      0x02393919 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x024e15de objc_exception_throw + 47 
2 CoreFoundation      0x0239542b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
3 CoreFoundation      0x02305116 ___forwarding___ + 966 
4 CoreFoundation      0x02304cd2 _CF_forwarding_prep_0 + 50 
... 
) 
terminate called after throwing an instance of 'NSException' 

에 연결됩니다.

답변

3
How do I catch global exceptions?에서

인용구 :.. "objc_exception_throw는 예외가 아니다 그것은 목표 - C의 예외를 throw하는 기능입니다 마찬가지로, EXC_ARITHMETIC는 오브젝티브 C 예외가 아니라 마하 (커널) 예외, 즉 당신의 앱이 완전히 무언가를하려했습니다. "- Peter Hosey May 14, at 9:14"

그 스레드에는 문제의 해결책에 대한 링크가 있지만 표시됩니다. 링크가 약간 위험한 것처럼 보이는 http://www.restoroot.com/Blog/2008/10/20/crash-reporter-for-iphone-applications-part-2/으로 연결되지만 작동한다면 가치가있을 것입니다.

이 관련 버그보고있다 예를 들면 : http://www.openradar.me/8081169 (게시 이달 초)

+0

게시물을 보내 주셔서 감사합니다. –

+0

내가 이해하지 못하는 것은이 경우에 예외가있다 : NSInvalidArgumentException은 잡히지 않은 것으로 명시되고 NSException의 인스턴스이다. 따라서 잡힐 수없는 어떤 종류의 예외가있는 것 같습니다. 오브젝트의 인스턴스에 알 수없는 메시지를 보내는 것은 objective-c와 같은 동적 인 언어에서 공통적 인 경우가되어야합니다. 그런 예외를 어떻게 처리할까요? –

+0

좋은 지적입니다. 'NSSetUncaughtExceptionHandler'를 들여다 보았습니까? 예 : http://stackoverflow.com/questions/1282364/iphone-exception-handling – Kalle

1

귀하의 문제를 올바르게 이해하는 경우.

Try/catch 블록이 올바르게 작동하고 있습니다.

코드를 실행하려고 시도하는 중 오류가 발생합니다. 오류를 catch하고 블록 내에서 코드를 작성할 때 수행 할 작업을 결정해야합니다. 평소에는 CATCH 부분에서 그렇게했습니다. finally 비트는 예외 또는 throw되지 않는 관계없이 실행됩니다.

+0

참조 자세한 내용에 대한 을 차단 @catch 넣어해야합니다. –

+0

NSArray가 비어 있기 때문에 항상 nil이 반환되므로 오류가 표시되지 않습니다. – markhunte

+0

시도해보십시오. \t NSArray * foo = [NSArray arrayWithObjects : @ "yeah", @ "yeah1", nil]; 대신 NSArray * foo = [[NSArray alloc] init]; – markhunte

1

귀하의 예제 코드는 NSException 예외를 잡기가 아니라 (아래 설명에서 정보를 요약 업데이트되었습니다.) 하나 던져, NSInvalidArgumentException. 특정 예외를 찾으려면 운이 더 좋을 수 있습니다.

NSArray * foo = [[NSArray alloc] init]; 

@try { 
    NSLog(@"trying..."); 
    [foo objectForKey:@"yeah"]; 
} 
@catch (NSInvalidArgumentException *e) { 
    NSLog(@"Invalid argument called."); 
} 
@catch (NSException * e) { 
    NSLog(@"catching %@ reason %@", [e name], [e reason]); 
} 
@finally { 
    NSLog(@"finally"); 
}

지금 당장은 직접 테스트 할 방법이 없습니다.

자세한 내용은 http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocExceptionHandling.html을 참조하십시오.

+0

NSInvalidArgumentException은 NSException 클래스 또는 NSException을 상속하는 클래스가 아닌 문자열 상수로 정의되므로 컴파일되지 않습니다. –

+1

http://www.openradar.me/8081169에 대한 참조가 정확한 것처럼 보입니다. 이 예외가 NSException에 의해 처리 될 것이라고 상상하지만 현재 도청 중입니다. –

0

아이폰/아이 패드 예외 처리를 처리 위해 당신은 @try이 예제 코드가 잡힐한다 예외를 강제로 단순한 시나리오 Exception Handling

관련 문제