@try-Objective-C에서 catch 블록


193

@try 차단이 작동하지 않는 이유는 무엇입니까? 앱이 다운되었지만 @try 블록에 걸리게되었습니다.

 NSString* test = [NSString stringWithString:@"ss"];

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }

위에 붙여 넣은 정확한 코드가 제대로 작동하기 때문에 다른 것이 아니라고 확신합니까? 2010-07-29 16 : 45 : 57.677 test [93103 : 207] 예외 : ***-[NSCFString characterAtIndex :] : 범위를 벗어난 범위 ​​또는 인덱스 2010-07-29 16 : 45 : 57.678 test [93103 : 207] 마지막으로
mbogh

2
NSString * test = [NSString stringWithString : @ "ss"]를 대체 할 수 있습니다. NSString * 테스트 = @ "ss";
Duyen-Hoa

답변:


136

모든 것이 완벽하게 작동합니다 :)

 NSString *test = @"test";
 unichar a;
 int index = 5;
    
 @try {
    a = [test characterAtIndex:index];
 }
 @catch (NSException *exception) {
    NSLog(@"%@", exception.reason);
    NSLog(@"Char at index %d cannot be found", index);
    NSLog(@"Max index is: %lu", [test length] - 1);
 }
 @finally {
    NSLog(@"Finally condition");
 }

로그:

[__NSCFConstantString characterAtIndex :] : 범위를 벗어난 범위 ​​또는 인덱스

인덱스 5의 문자를 찾을 수 없습니다

최대 지수는 : 3

마지막으로 조건


8
정확하지만 약간 오해의 소지가 있습니다. @finally 블록은 모두 예외가 발생했는지 여부에 관계없이 두 경우 모두에서 실행됩니다.
Elendurwen 2016 년

그래, 나는 이것을 그리워한다 :)
iTux

@Elendurwen이 지적한대로 수정하십시오.
Sanich

78

이제 문제를 발견했습니다.

obj_exception_throw내 중단 점에서를 제거하면 이 문제가 해결되었습니다. 이제 @try블록에 걸리고 블록이 없으면 NSSetUncaughtExceptionHandler이를 처리합니다 @try.


10
디버거가 중단 될 때 계속을 누르면 처리기에서 예외가 발생하고 포착되는 것을 볼 수 있습니다.
JeremyP

1

Objective-C는 Java가 아닙니다. Objective-C에서는 예외라고합니다. 예외! 오류 처리에 사용하지 마십시오. 그들의 제안이 아닙니다. characterAtIndex를 사용하기 전에 문자열의 길이를 확인하면 모든 것이 잘됩니다 ....


Objective-C에서 try-catch를 사용하는 것은 일반적으로 ARC를 망칠 수 있으므로 권장하지 않습니다.
느리게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.