@try - bloque de captura en Objective-C

193

¿Por qué @try no bloquea el trabajo? Se bloqueó la aplicación, pero se suponía que debía ser atrapada por el bloque @try.

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

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }
Alexandru Circus
fuente
¿Está seguro de que no es otra cosa porque el código exacto que ha pegado anteriormente funciona bien? 2010-07-29 16: 45: 57.677 prueba [93103: 207] Excepción: *** - [NSCFString characterAtIndex:]: Rango o índice fuera de límites 2010-07-29 16: 45: 57.678 prueba [93103: 207] finalmente
mbogh
2
Puede reemplazar NSString * test = [NSString stringWithString: @ "ss"]; con NSString * test = @ "ss";
Duyen-Hoa

Respuestas:

136

Todo funciona perfectamente :)

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

Iniciar sesión:

[__NSCFConstantString characterAtIndex:]: Rango o índice fuera de los límites

Char en el índice 5 no se puede encontrar

El índice máximo es: 3

Finalmente condicion

iTux
fuente
8
Correcto pero un poco engañoso: recuerde que el bloque @finally se ejecuta en AMBOS casos, es decir, independientemente de si se produjo o no una excepción.
Elendurwen
Sí, extraño esto :)
iTux
Por favor arregle como señaló @Elendurwen.
Sanich
78

Ahora he encontrado el problema.

Eliminar el obj_exception_throwde mis puntos de interrupción resolvió esto. Ahora está atrapado por el @trybloque y también NSSetUncaughtExceptionHandlermanejará esto si @tryfalta un bloque.

Alexandru Circus
fuente
10
Si presiona continuar cuando se rompe el depurador, debería ver que la excepción es lanzada y atrapada por su controlador.
JeremyP
1

Objective-C no es Java. En Objective-C, las excepciones son lo que se llaman. Excepciones! No los use para el manejo de errores. No es su propuesta. Simplemente verifique la longitud de la cadena antes de usar characterAtIndex y todo estará bien ...

Claus Bönnhoff
fuente
Por lo general, no se recomienda el uso de try-catch en Objective-C porque potencialmente puede estropear el ARC.
lento