@try - cattura il blocco in Objective-C


193

Perché il blocco @try non funziona? Ha bloccato l'app, ma doveva essere catturato dal blocco @try.

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

 @try {
    [test characterAtIndex:6];

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

Sei sicuro che non sia qualcos'altro perché il codice esatto che hai incollato sopra funziona bene. 29/07/2010 16: 45: 57.677 test [93103: 207] Eccezione: *** - [NSCFString characterAtIndex:]: intervallo o indice fuori limite 2010-07-29 16: 45: 57.678 test [93103: 207] finalmente
mbogh,

2
È possibile sostituire NSString * test = [NSString stringWithString: @ "ss"]; con NSString * test = @ "ss";
Duyen-Hoa,

Risposte:


136

Tutto funziona perfettamente :)

 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:]: intervallo o indice fuori dai limiti

Il carattere all'indice 5 non è stato trovato

L'indice massimo è: 3

Finalmente condizione


8
Corretto ma un po 'fuorviante - ricorda che il blocco @finally viene eseguito in ENTRAMBI i casi, vale a dire indipendentemente dal fatto che sia stata generata o meno un'eccezione.
Elendurwen,

Sì, mi manca questo :)
iTux il

Correggi come indicato da @Elendurwen.
Sanich,

78

Ora ho trovato il problema.

La rimozione di obj_exception_throwdai miei punti di interruzione ha risolto questo problema. Ora viene catturato dal @tryblocco e NSSetUncaughtExceptionHandlerlo gestirà anche se @trymanca un blocco.


10
Se premi continui quando il debugger si rompe, dovresti vedere l'eccezione che viene generata e catturata dal gestore.
JeremyP,

1

Objective-C non è Java. In Objective-C le eccezioni sono quelle che vengono chiamate. Eccezioni! Non utilizzarli per la gestione degli errori. Non è la loro proposta. Basta controllare la lunghezza della stringa prima di utilizzare characterAtIndex e tutto va bene ....


L'uso di try-catch in Objective-C non è generalmente raccomandato perché può potenzialmente rovinare ARC.
lento
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.