1

我在 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

这里是我的 Objective-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 块中的代码!

为什么会有这种差异?

[编辑] 抱歉,@try ... @try ... @try ... 是一个错误。我改变了它,但问题是一样的,我无法在objective-c测试中达到finally块

4

2 回答 2

4

您的 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");
}
于 2011-08-08T10:18:37.017 回答
-1

好的,我解决了我的问题。

在我的 Objective-C 测试中,应用程序崩溃了,这就是为什么 finally 块没有到达。

如果我在 main 中添加一个 try catch 块,现在在我的函数中,终于到达了块!

因此,我确认无论是否发生异常(并重新抛出),最终块仍然到达。

于 2011-08-08T13:11:18.707 回答