@try - catch catch w Objective-C

193

Dlaczego @try block nie działa? Awaria aplikacji, ale miał zostać złapany przez blok @try.

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

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }
Alexandru Circus
źródło
Czy na pewno nie jest to coś innego, ponieważ dokładnie wklejony powyżej kod działa dobrze. 2010-07-29 16: 45: 57.677 test [93103: 207] Wyjątek: *** - [NSCFString characterAtIndex:]: Zakres lub indeks poza zakresem 2010-07-29 16: 45: 57.678 test [93103: 207] wreszcie
mbogh
2
Możesz zastąpić NSString * test = [NSString stringWithString: @ "ss"]; z NSString * test = @ "ss";
Duyen-Hoa

Odpowiedzi:

136

Wszystko działa idealnie :)

 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");
 }

Log:

[__NSCFConstantString characterAtIndex:]: Zakres lub indeks poza granicami

Nie można znaleźć znaku o indeksie 5

Indeks maksymalny wynosi: 3

Wreszcie warunek

iTux
źródło
8
Prawidłowe, ale nieco mylące - pamiętaj, że blok @finally jest wykonywany OBYDWU przypadkach, tj. Niezależnie od tego, czy wyjątek został zgłoszony, czy nie.
Elendurwen,
Tak, tęsknię za tym :)
iTux,
Napraw tak, jak zauważył @Elendurwen.
Sanich,
78

Teraz znalazłem problem.

Usunięcie obj_exception_throwz moich punktów przerwania rozwiązało to. Teraz jest przechwytywany przez @tryblok, a także NSSetUncaughtExceptionHandlerporadzi sobie z tym, jeśli @trybrakuje bloku.

Alexandru Circus
źródło
10
JEŻELI zostanie naciśnięty przycisk kontynuuj, gdy debugger się zepsuje, powinieneś zobaczyć wyjątek rzucony i złapany przez program obsługi.
JeremyP
1

Cel-C to nie Java. W Objective-C wyjątki są nazywane. Wyjątki! Nie używaj ich do obsługi błędów. To nie jest ich propozycja. Po prostu sprawdź długość łańcucha przed użyciem characterAtIndex i wszystko jest w porządku ....

Claus Bönnhoff
źródło
Używanie try-catch w Objective-C zasadniczo nie jest zalecane, ponieważ może potencjalnie zepsuć ARC.
wolny