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

¿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


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.


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 ...


Por lo general, no se recomienda el uso de try-catch en Objective-C porque potencialmente puede estropear el ARC.
lento
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.