在Objective-C類中找到了這個有趣的代碼,用於捕獲NSExceptions並將它們作爲NSErrors傳遞給Swift代碼。Objective-C try-catch - 爲什麼編譯?爲什麼返回不同的構建調試版本?
我不明白的是: 1)爲什麼它甚至編譯?如果拋出異常,則永遠不會有返回值。 2)爲什麼當使用debug(優化級別none)和release(優化級別最小/最快)進行編譯時,返回值會有所不同?
- (BOOL)catchException:(void(^)())tryBlock error:(__autoreleasing NSError **)error {
@try {
tryBlock();
return YES;
}
@catch (NSException *exception) {
NSMutableDictionary *userInfo = [exception.userInfo mutableCopy];
if (!userInfo) userInfo = [NSMutableDictionary new];
userInfo[NSLocalizedDescriptionKey] = exception.reason;
*error = [[NSError alloc] initWithDomain:exception.name code:0 userInfo:userInfo];
}
// Note the missing return value outside the try-catch
}
調用函數:
NSError *error;
BOOL result = [self catchException:^{
@throw [NSException exceptionWithName:@"Exception" reason:@"WTF?" userInfo:nil];
} error:&error];
NSLog(@"Result: %@", result ? @"YES" : @"NO");
當編譯與調試方案運行,我們得到:
:2017-02-09 10:01:39.695 Compile Test[23129:630118] Result: NO
而且與發行方案做同樣的時
2017-02-09 10:01:39.695 Compile Test[23129:630118] Result: YES
因此,在兩種情況下,即使try-catch塊外沒有返回值,try-catch中的返回值也永遠不會達到,但似乎有返回值。我們都很困惑在這裏?!
用Apple提交了一個錯誤報告。有更多的問題比這更多。 –
謝謝你提交bug! – bbum