我正在从服务器上工作加载数据,但有时服务器未连接(错误)。
我想尝试/捕捉或避免错误应用程序
1:在加载数据时尝试/cactch2:尝试/捕获图像
我不知道如何使用我写代码是:
@try
{
dispatch_async(htvque, ^{
NSData* data = [NSData dataWithContentsOfURL: [NSURL URLWithString:listChannel]];
NSError* error;
jsonTable = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (error) {
NSLog(@"%@", error);
}
else
{
NSMutableArray *arrImage = [jsonTable objectForKey:@"ListImage"];
for (int i =0; i<arrImage.count; i++) {
UIImage * result;
UIImageView *imgView = [[UIImageView alloc] init];
imgView.frame = CGRectMake(0, 30 * i , 20, 20);
imgView.image = result;
@try
{
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString: [arrImage objectAtIndex:i]]];
result = [UIImage imageWithData:data];
[self.view addSubview:imgView];
}
@catch
{}
@finally
{}
}
}
});
}
@catch(NSException * exp)
{
NSLOG(@"abc");
}
@finnaly
{
}
不要为您的OBJC程序使用异常。
在OBJC中,仅保留使用例外情况:
- 您不打算恢复
- 当您不打算恢复时
- 如果在那里甚至适当的例外(我只是不使用它们,但这对很多人来说是有点核心)。
无论如何 - OBJC中的一个例外表示程序员错误,从逻辑上讲,您无法期望从其他语言中恢复过来(与其他语言不同)。找出您的错误是什么,而不是"尝试吞咽"错误处理。
我建议的补救措施是创建一个新问题,该问题显示了适当的代码,并详细介绍了例外,如何重现等等。
注意:实际上,少数几个奇怪的可可API会在少于特殊情况下抛出的情况下,当他们应该使用另一种方法来处理错误处理时,例如NSError
。您将在开发中看到的绝大多数可可例外是您应该且可以纠正的问题(范围错误,对选择器不响应,参考计数)。
我认为这将是做您想做的合理的方法。我希望一个示例显示大量的F错误检查而不依赖尝试/捕获
dispatch_async(htvque, ^{
NSError* error = nil;
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:listChannel] options:0 error:&error];
if (error) { NSLog(@"%@", error); return; }
NSDictionary *jsonTable = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (error) { NSLog(@"%@", error); return; }
if (![jsonTable isKindOfClass:[NSDictionary class]]) { NSLog(@"jsonTable is not an NSDictionary: %@", jsonTable); return; }
NSArray *images = [jsonTable objectForKey:@"ListImage"];
if (![images isKindOfClass:[NSArray class]]) { NSLog(@"images is not an NSArray: %@", images); return; }
NSMutableArray *dataForImages = [NSMutableArray arrayWithCapacity:images.count];
// Build up an array with all the image data. For simplicity sake, I'll just skip ones the fail to load.
for (NSString *URLString in images) {
if (![URLString isKindOfClass:[NSString class]]) { NSLog(@"URLString is not an NSString: %@", URLString); continue; }
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URLString] options:0 error:&error];
if (error) { NSLog(@"%@", error); continue; }
[dataForImages addObject:data];
}
// MUST SWITCH TO MAIN QUEUE BEFORE UPDATING UI!!!!!!!
dispatch_sync(dispatch_get_main_queue(), ^{
// This is just a different way of iterating the array.
[dataForImages enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
UIImage *image = [UIImage imageWithData:obj];
if (!image) { NSLog(@"Could not create image from data at index %d", idx); return; }
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(0, 30 * idx , 20, 20);
[self.view addSubview:imageView];
}];
});
});
这确实不应该是一个有效的解决方案,而是一个粗略的轮廓。