@try - bloquer le bloc dans Objective-C


193

Pourquoi le bloc @try ne fonctionne-t-il pas? L'application s'est bloquée, mais elle était censée être prise par le bloc @try.

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

 @try {
    [test characterAtIndex:6];

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

Êtes-vous sûr que ce n'est pas autre chose, car le code exact que vous avez collé ci-dessus fonctionne correctement. 2010-07-29 16: 45: 57.677 test [93103: 207] Exception: *** - [NSCFString characterAtIndex:]: plage ou index hors limites 2010-07-29 16: 45: 57.678 test [93103: 207] enfin
mbogh

2
Vous pouvez remplacer NSString * test = [NSString stringWithString: @ "ss"]; avec NSString * test = @ "ss";
Duyen-Hoa

Réponses:


136

Tout fonctionne parfaitement :)

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

Journal:

[__NSCFConstantString characterAtIndex:]: plage ou index hors limites

Caractère à l'index 5 introuvable

L'indice maximum est: 3

Enfin condition


8
Correct mais un peu trompeur - rappelez-vous que le bloc @finally est exécuté dans les DEUX cas, c'est-à-dire que l'exception ait été ou non levée.
Elendurwen

Ouais, ça me manque :)
iTux

Veuillez corriger comme @Elendurwen l'a noté.
Sanich

78

Maintenant, j'ai trouvé le problème.

Supprimer le obj_exception_throwde mes points d'arrêt a résolu ce problème. Maintenant, il est attrapé par le @trybloc et NSSetUncaughtExceptionHandlergère également cela si un @trybloc est manquant.


10
Si vous appuyez sur continuer lorsque le débogueur se casse, vous devriez voir que l'exception est levée et interceptée par votre gestionnaire.
JeremyP

1

Objective-C n'est pas Java. Dans Objective-C, les exceptions sont ce qu'elles sont appelées. Des exceptions! Ne les utilisez pas pour la gestion des erreurs. Ce n'est pas leur proposition. Vérifiez simplement la longueur de la chaîne avant d'utiliser characterAtIndex et tout va bien ....


L'utilisation de try-catch dans Objective-C n'est généralement pas recommandée car elle peut potentiellement gâcher l'ARC.
lente
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.