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

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


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.


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 ....


Używanie try-catch w Objective-C zasadniczo nie jest zalecane, ponieważ może potencjalnie zepsuć ARC.
wolny
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.