:
@finally — Defines a block of related code that is subsequently executed whether an exception is thrown or not.
하지만 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 ;
}
단순히 컴파일하고 실행 :
$ 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
@Perception을 중복 가능성이 질문에 대답하지 않습니다. 이 질문과 문서는 try 블록에 예외가 있는지 없는지 여부에 관계없이 finally 절을 호출하지만 catch 블록에서 예외가 발생할 경우 어떤 일이 발생하는지에 대해서는 언급하지 않았습니다. 그것은 부름을받을 수 있지만, 다른 질문은이 질문을 명확히하지 않습니다. – rmaddy
@Madbreaks Eugene에서 링크 된 문서에서 "throw e"대신 "@throw"를 호출하여 예외를 다시 발생시켜야합니다. 문서를 보면 일종의 "finally"가 호출된다고 명시되어 있습니다. – rmaddy
복구를 위해 예외를 포착해서는 안됩니다. iOS 및 OS X에서 예외는 복구 할 수없는 오류 만 표시하는 데 사용됩니다 (극히 소수의 좋지 않은 경우가 있음). – bbum