1

Java および dobjective-C プログラムを使用して例外をテストします。

これらのテストでは、例外がキャッチされて再スローされたときに、最終的にブロックに到達する方法に違いがあることがわかります。

ここで私の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

そしてここで私の目標-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

最終ブロックのコードに到達していません!

この違いはなぜですか?

[編集] すみません、@try ... @try ... @try... は間違いでした。変更しましたが、問題は同じです。objective-c テストで finally ブロックに到達できません

4

2 に答える 2

4

Objective-C コードには finally ブロックがなく、try ブロックが 3 つしかありません。次のようになります。

@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");
}
于 2011-08-08T10:18:37.017 に答える
-1

OK、私は私の問題を解決しました。

私の目標 c テストでは、アプリケーションがクラッシュしたため、最終的にブロックに到達しませんでした。

メインに try catch ブロックを追加すると、関数で、最終的にブロックに到達します!

そのため、例外が発生した (および再スローされた) かどうかに関係なく、finally ブロックにまだ到達していることを確認します)。

于 2011-08-08T13:11:18.707 に答える