2010-07-29 20 views
169

¿Por qué el bloque @try no funciona? Se bloqueó la aplicación, pero se suponía que estaba atrapado por el bloque @try.@try - catch block en Objective-c

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

@try { 
    [test characterAtIndex:6]; 

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

Puede reemplazar NSString * test = [NSString stringWithString: @ "ss"]; con NSString * test = @ "ss"; –

Respuesta

69

Ahora he encontrado el problema.

Al eliminar el obj_exception_throw de mis puntos de ruptura, se solucionó esto. Ahora está atrapado en el bloque @try y también, NSSetUncaughtExceptionHandler se ocupará de esto si falta un bloque @try.

+10

SI presiona continuar cuando el depurador se rompe, debería ver que su manejador tira y atrapa la excepción. – JeremyP

11

¿Estás seguro de que no es otra cosa porque el código exacto que has pegado funciona bien.

2010-07-29 16:45:57.677 test[93103:207] Exception: *** -[NSCFString characterAtIndex:]: Range or index out of bounds 
2010-07-29 16:45:57.678 test[93103:207] finally 
104

Todo funciona perfectamente :)

NSString *test = @"test"; 
    unichar a; 
    int index = 5; 

    @try { 
     a = [test characterAtIndex:index]; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"%@", exception.reason); 
    } 
    @finally { 
     NSLog(@"Char at index %d cannot be found", index); 
     NSLog(@"Max index is: %d", [test length]-1); 
    } 

Log:

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

Char en el índice 5 no se puede encontrar

El índice máximo es: 3

+5

Correcto pero un poco engañoso: recuerde que el bloque @finally se ejecuta en AMBOS casos, es decir, independientemente de si la excepción fue o no lanzada. – Elendurwen

+0

Sí, echo de menos esto :) – iTux