@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");
 }
Cirque d'Alexandru
la source
Ê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

iTux
la source
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.

Cirque d'Alexandru
la source
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 ....

Claus Bönnhoff
la source
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