Java против Objective-C: исключение, достижение блока finally - PullRequest
1 голос
/ 08 августа 2011

Я тестирую исключения, используя в java и программах dobjective-C.

В этих тестах я вижу разницу в способе достижения блока finally, когда исключение перехватывается и перебрасывается.

Вот мой тест Java:

    try {
        Boolean bThrow = true;
        System.out.println("try : before exception sent");
        if (bThrow) {
            throw new Exception();
        }
        System.out.println("try : after sent");
    }
    catch (Exception e) {
        System.out.println("catch, rethrow");
        throw e;
    }
    finally {
        System.out.println("finally");
    }

, который отображает:

try: before exception sent
catch, rethrow
finally

А вот мой тест target-c:

    @try {
        NSException *myexc = [NSException exceptionWithName:@"exceptionTest" reason:@"exceptionTest" userInfo:nil];
        BOOL bThrow = YES;
        NSLog(@"try : before exception sent");
        if (bThrow) {
            @throw myexc;
        }
        NSLog(@"try : after sent");
    }
    @catch (Exception *exception) {
        NSLog(@"catch, rethrow");
        @throw exception;
    }
    @finally {
        NSLog(@"finally");
    }

, который отображает:

try: before exception sent
catch, rethrown
*** Terminating app

Код в блоке finally не достигнут!

Почему эта разница?

[EDIT] Извините, @try ... @try ... @try ... была ошибка.Я изменил его, но проблема та же, я не могу достичь, наконец, блока в тесте target-c

Ответы [ 2 ]

4 голосов
/ 08 августа 2011

Ваш код Objective C не имеет блока finally, только три блока try. Это должно выглядеть так:

@try {
    NSException *myexc = [NSException exceptionWithName:@"exceptionTest" reason:@"exceptionTest" userInfo:nil];
    BOOL bThrow = YES; // Use BOOL or bool
    NSLog(@"try : before exception sent");
    if (bThrow) {
        @throw myexc;
    }
    NSLog(@"try : after sent");
}
@catch (NSException *e) {  // use catch not another try
    NSLog(@"catch, rethrow");
    @throw e;
}
@finally {                 // use finally not another try
    NSLog(@"finally");
}
0 голосов
/ 08 августа 2011

ОК, я решил свою проблему.

В моем тесте target-c приложение зависло, поэтому, наконец, блок не был достигнут.

Если я добавлю блок try catch в основной, теперь в моей функции, наконец, достигнут блок!

Итак, я подтверждаю, что, наконец, блок все еще достигнут, независимо от того, происходит ли исключение (и перебрасывается) или нет).

...