gpt4 book ai didi

ios - 围绕包含 block 的整个方法的 try/catch 是否不会捕获 block 内的异常?

转载 作者:行者123 更新时间:2023-11-29 12:33:52 34 4
gpt4 key购买 nike

请看下面的代码。如果 block [UIView animateWithDuration: animations:^{} completion:^(BOOL finished){}] 中有异常,外部 try/catch 是否会从 (void)completeAnimationClose 方法是否捕获异常?

或者 block 是否需要自己单独的 try/catch?

- (void)completeAnimationClose
{
@try
{
self.fullImage.hidden = NO;
[self.fullImageCopy removeFromSuperview];

[UIView animateWithDuration:0.4
animations:^{self.bgView.alpha = 0.0;}
completion:^(BOOL finished){}];

[UIView animateWithDuration:0.6
animations:^{

CGRect rect = [self.tableView convertRect:self.itemImageView.frame toView:nil];

self.bgView.frame = CGRectMake(rect.origin.x, rect.origin.y, self.itemImageView.frame.size.width, self.itemImageView.frame.size.height);
self.fullImage.frame = CGRectMake(rect.origin.x, rect.origin.y, self.itemImageView.frame.size.width, self.itemImageView.frame.size.height);
self.btnRemoveImage.frame = CGRectMake(rect.origin.x, rect.origin.y, self.itemImageView.frame.size.width, self.itemImageView.frame.size.height);

}
completion:^(BOOL finished){

[self.bgView removeFromSuperview];
[self.fullImage removeFromSuperview];
[self.btnRemoveImage removeFromSuperview];
}];
}
@catch (NSException *exception)
{
NSLog(@"CRASH");
}
}

最佳答案

在您的 completeAnimationClose 方法退出后,这些 block 将在单独的上下文中执行。这将它们置于不同的范围内,使它们不再包含在您的 @try {} @catch (..) {} 中。这意味着 block 内抛出的任何异常都不会被捕获,因为它们将在不同的上下文中执行。

旁注:如果您期望动画或完成 block 中出现异常,则您可能做错了什么。

第二个旁注:同步块(synchronized block)中的异常将被捕获。示例:

@try {
NSArray *array = @[@(1), @(2)];
void (^test)() = ^{
[array objectAtIndex:3];
};
test();
}
@catch (NSException *exception) {
NSLog(@"Exception gets caught.");
}

关于ios - 围绕包含 block 的整个方法的 try/catch 是否不会捕获 block 内的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26892547/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com