2017-03-23 1 views
2

저는 응용 프로그램에서 퍼즈 테스트를 실행 중이므로 특별히 처리되지 않는 런타임 오류를 찾고 있습니다. 응용 프로그램은 ObjC와 Swift 모두로 작성되었지만 단위 테스트는 Swift로 작성되었습니다.신속한 캐치 런타임 예외

나는 임의적 인 런타임 예외를 잡아내는 것이 아니라는 단서를 알고 있지만 이것은 순전히 단위 테스트를위한 것입니다. 스위프트에서

#import "ObjC2Swift.h" 

@implementation ObjC 

+ (id)catchException:(id(^)())tryBlock error:(__autoreleasing NSError **)error { 
    @try { 
     id result = tryBlock(); 
     return result; 
    } 
    @catch (NSException *exception) { 
     if (error) { 
      *error = [[NSError alloc] initWithDomain:exception.name code:0 userInfo:exception.userInfo]; 
     } 
     return nil; 
    } 
} 

@end 

가로 불리는 : 어떻게, 내가 간단한의 Obj-C 클래스를 사용하고 신속한에서의 Obj-C의 예외를 포착하기 위해

+0

Obj-C 예외 또는 신속 예외에 대해 이야기하고 있습니까? 신속한 예외는 다루기 쉽지 않습니다. Obj-C 예외는 유틸리티 Obj-C 함수를 사용하여 간단히 포착 할 수 있습니다. – Sulthan

+0

대부분의 오류는 ObjC에서 올 것이라고 생각합니다. 해결책으로는 충분할 것입니다. –

답변

3

(경계 등에서 즉, 인덱스)이 예외를 런타임 붙잡는

let result = try? ObjC.catchException { ... dangerous code here ... } 

아무 것도 반환하지 않는 블록에는 다른 변형이 필요할 수 있습니다.

악용. Obj-C 예외는 악이며 나는 이것을 사용하는 라이브러리가 필요하기 때문에 이것을 사용해야한다.

+0

훌륭한 아이디어, upvoted. 1) Swift에 대한 예외를 catchException()의 반환 값으로 반환하여 예외 클래스 또는 NSException 하위 클래스의 사용자 정의 속성을 비롯한 이유와 같은 속성을 확인할 수 있습니다. NSError로 변환하지 마십시오. 2) 누군가가 NSException에서 파생되지 않은 예외를 throw하는 경우 ID를 캐치합니다. –

+0

@VaddadiKartick Swift'try'를 사용하고 싶다면 예외를 반환하지 말고'NSError' 변환이 필요합니다. Obj-C에서 Swift'try' 기반의'NSError' 처리는 여러분이 반환한다고 가정합니다 오류가 있으면'nil' (또는'false')을 사용하십시오. – Sulthan

+0

나는 당신의 취향을 이해했습니다. 나는 반환 값으로 예외를 얻는 것을 꺼려하고 Objective-C에서 사용할 수있는 모든 정보를 Swift로 다시 전달하기를 바랍니다. –