@try - bloco de captura no Objective-C

193

Por que o @try block não funciona? Ele travou o aplicativo, mas deveria ser pego pelo bloco @try.

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

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }
Alexandru Circus
fonte
Tem certeza de que não é outra coisa, porque o código exato que você colou acima funciona bem. 2010-07-29 16: 45: 57.677 teste [93103: 207] Exceção: *** - [NSCFString characterAtIndex:]: intervalo ou índice fora dos limites 2010-07-29 16: 45: 57.678 teste [93103: 207] finalmente
mbogh
2
Você pode substituir o NSString * test = [NSString stringWithString: @ "ss"]; com NSString * test = @ "ss";
Duyen-Hoa

Respostas:

136

Todos funcionam perfeitamente :)

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

Registro:

[__NSCFConstantString characterAtIndex:]: intervalo ou índice fora dos limites

Não é possível encontrar o caractere no índice 5

O índice máximo é: 3

Finalmente condição

iTux
fonte
8
Correto, mas um pouco enganador - lembre-se de que o bloco @finally é executado em AMBOS os casos, ou seja, independentemente de a exceção ter sido ou não lançada.
Elendurwen
Sim, eu sinto falta disso :)
iTux 20/17
Corrija como @Elendurwen anotou.
Sanich
78

Agora eu encontrei o problema.

A remoção obj_exception_throwdos pontos de interrupção resolveu isso. Agora ele é capturado pelo @trybloco e, também, NSSetUncaughtExceptionHandlerlidará com isso se um @trybloco estiver faltando.

Alexandru Circus
fonte
10
Se você pressionar continue quando o depurador for interrompido, a exceção será lançada e capturada pelo seu manipulador.
JeremyP
1

Objective-C não é Java. No Objective-C, as exceções são o que são chamadas. Exceções! Não os use para manipulação de erros. Não é a proposta deles. Basta verificar o comprimento da string antes de usar characterAtIndex e está tudo bem ....

Claus Bönnhoff
fonte
O uso de try-catch no Objective-C geralmente não é recomendado, pois pode atrapalhar o ARC.
lento