2012-03-21 9 views
3

사용자의 로그 파일에 로그 할 수 있도록 Mac 응용 프로그램에서 예외를 잡으려고합니다.잡히지 않은 예외 처리기가

void uncaughtExceptionHandler(NSException *exception) { 
    NSLog(@"It Works!"); 
} 

그리고 나는이처럼 내 -applicationDidFinishLaunching: 방법을 설정 해요 : :이 같은 예외 처리기를 구현하고있어

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

가 그럼 난 이렇게 그것을 테스트 예외가 발생 :

[[NSArray arrayWithObject:@"object"] objectAtIndex:1]; 

예외가 콘솔에 기록되지만 예외 핸들러가 호출되지 않습니다.

아이디어가 있으십니까?

답변

4

해결책은 ExceptionHandling 프레임 워크를 사용하는 것입니다. 여기에 어떻게 내가 해냈어 :

[[NSExceptionHandler defaultExceptionHandler] setExceptionHandlingMask:NSLogAndHandleEveryExceptionMask]; 
[[NSExceptionHandler defaultExceptionHandler] setDelegate:self]; 

-applicationDidFinishLaunching:에서 그 다음 내 응용 프로그램 위임 클래스에서 나는 두 대리자 메서드를 구현

- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException *)exception mask:(NSUInteger)aMask 
- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldHandleException:(NSException *)exception mask:(NSUInteger)aMask 

지금은 모든 예외를 잡을 수 있습니다!

2

AppKit에는 먼저 예외를 잡는 자체 스레드에 자체 고급 예외 처리기가 있습니다. NSApplication을 서브 클래스 화하고 -reportException:을 오버라이드하여 무언가를 할 수 있습니다.

예외 처리기가 여전히 다른 스레드에서 호출 될 수 있습니다.

참조 번호 : Tim Wood's message on macosx-dev back in 1999.

+0

나는 그것을 시도했지만 아직 예외를 잡지 못하고있다. '-reportException :'결코 호출되지 않습니다. 예외가'-applicationDidFinishLaunching :'에서 발생했다면 호출되어서는 안된다. 메인 스레드에서 실행되지 않습니까? – edc1591

+0

예,'-applicationDidFinishLaunching :'이 메인 스레드에서 호출됩니다. 'NSApplication' 서브 클래스를 사용하고 있습니까? 'NSPrincipalClass' 키의'Info.plist'에 클래스 이름을 지정해야합니다. –

+0

예, 확신합니다. '[NSApp class];는 내 서브 클래스를 반환합니다. – edc1591

관련 문제