Objective c 如果catch块中抛出异常,是否会执行finally块?
可能重复:Objective c 如果catch块中抛出异常,是否会执行finally块?,objective-c,exception-handling,Objective C,Exception Handling,可能重复: 考虑这一块目标C伪代码: NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; @try { throw [[NSException alloc] init]; } @catch (NSException *e) { throw e; } @finally { [pool drain]; } 游泳池会被排干吗?或者@catch块中的抛出会使代码无法访问吗?我觉得游泳池应该被排干,但我找不到
考虑这一块目标C伪代码:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@try {
throw [[NSException alloc] init];
}
@catch (NSException *e) {
throw e;
}
@finally {
[pool drain];
}
游泳池会被排干吗?或者@catch
块中的抛出
会使代码无法访问吗?我觉得游泳池应该被排干,但我找不到这样或那样的文件
是的,我可以编写一些代码并进行测试,但目前这是不可行的
感谢:
@finally-定义一个相关代码块,无论是否引发异常,该代码块都将随后执行。
但它没有提到catch块中的异常。
这个例外不会被忽略,这听起来是合乎逻辑的
我制作了一个简单的程序来检查:
import <Foundation/Foundation.h>
int main(int argc, char **argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init] ;
int result = 0 ;
@try {
@throw [NSException exceptionWithName:@"Exception" reason:@"@try" userInfo:nil];
}
@catch (id exception) {
@throw [NSException exceptionWithName:@"Exception" reason:@"@catch" userInfo:nil];
}
@finally {
NSLog(@"Finally");
}
[pool release] ;
return result ;
}
与本地@catch异常处理程序关联的@finally块
在@throw导致下一个更高的异常处理程序之前执行
被调用
有关本例中内存管理的更多说明,请参见链接文档页面的最底部。在您的示例中,您是“OK”的,因为异常本身并不是作为您在finally块中正在排空的池的一部分自动释放的。但是,如果没有人发布该异常,则可能会泄漏该异常
(但在某些情况下,异常生命周期似乎有些模糊,请参见:)@认为可能的重复并不能回答这个问题。这个问题和文档清楚地表明,无论try块中是否存在异常,都会调用finally子句,但是没有提到如果从catch块抛出异常会发生什么。它可能会被调用,但另一个问题没有澄清这个问题。@Madbreak从Eugene链接的文档中可以看出,您应该调用“@throw”而不是“throw e”来重新显示异常。文档暗示(虽然没有明确说明)如果您这样做,将调用“finally”。请注意,您绝对不应该为了从异常中恢复而捕获异常。在iOS和OS X中,异常仅用于表示不可恢复的错误(只有极少数糟糕的奇数情况)。@DanJ从什么时候开始在英语中我们在冒号后大写?请不要仅仅为了编辑而编辑,这不是编辑的目的。@bbum在这个伪代码中,您认为我试图从异常中恢复吗?相反,这个例外被重新提出。但是,我不相信引用的话是这么说的。我相信这句话的意思是,无论
try
块中是否抛出异常,都将执行finally
块。“根据那句话把它当作真理来接受,对我来说,这是一个灰色地带。”我已经更正了答案。在最初的问题“这个异常不会是cougt听起来很合理”,中丢失了关于catch block的部分,对,它不会。这不是我要问的。我在问(在您的示例中)“Finally”
是否将被记录。谢谢-这是我所看到的最令人放心的文档(显然我没有看到所有文档)。我觉得其他地方的文档只讨论了try
块中提出的异常,这就是为什么我很难简单地接受为事实。@Eugene发布的示例程序似乎与此不符吗?@Madbreaks不——他的示例应用程序在记录器有机会打印到控制台之前就因未处理的异常而死亡。如果使用相同的示例,但从另一个try/catch中调用它,您将看到“finally”日志打印出来。
$ gcc -framework Foundation -fobjc-exceptions test.m
$ ./a.out
2012-12-29 00:39:21.667 a.out[86205:707] *** Terminating app due to uncaught exception 'Exception', reason: '@catch'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff8e3050a6 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff8e56e3f0 objc_exception_throw + 43
2 a.out 0x0000000107d48d47 main + 359
3 libdyld.dylib 0x00007fff90b4e7e1 start + 0
)
libc++abi.dylib: terminate called throwing an exception
Abort trap: 6