【发布时间】:2013-11-04 15:17:58
【问题描述】:
我正在使用 UITableView。如果没有网络连接,viewDidload 会抛出异常。我的 viewDidLoad 函数是:
@try {
NSLog(@"Request URL = %@",URLString);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
URLWithString:URLString]];
NSData *response = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil error:nil];
NSError *jsonParsingError = nil;
NSDictionary *tableData = [NSJSONSerialization JSONObjectWithData:response
options:0
error:&jsonParsingError];
// Grab whole data with data field in JSON
// responseArray = [tableData objectForKey:@"data"];
responseArray = [[NSMutableArray alloc]initWithArray:[tableData objectForKey:@"data"]];
for(int i = 0; i < responseArray.count; i++)
{
NSArray * tempArray = responseArray[i];
responseArray[i] = [tempArray mutableCopy];
}
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(280.0, 0.0, 40.0, 40.0)];
[btn setImage:[UIImage imageNamed:@"sort_icon.png"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(showActionSheet) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barbutton = [[UIBarButtonItem alloc]initWithCustomView:btn];
self.navigationItem.rightBarButtonItem = barbutton;
}
@catch (NSException *exception)
{
exceptionOccured = YES;
NSLog(@"Exception Ocurred");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Error in connectivity" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
在 cellForRowAtIndexPath 中我正在这样做:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
@try {
NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];
tempDict = [responseArray objectAtIndex:indexPath.row];
return cell;
}
@catch (NSException *exception)
{
NSLog(@"Error in CEll Create");
NSLog(@"Draw Alert");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Error in connectivity" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
在我正在做的 AlertViewDelegate 函数中
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
[self.navigationController popViewControllerAnimated:YES];
}
现在的问题是,每当出现异常并重新抛出异常并显示错误时,它都不会显示警报
Thread 1: EXC_BAD_ACCESS(code=2, address=0x2)
任何帮助将不胜感激...
【问题讨论】:
-
你应该重写你的代码以避免抛出异常。它们不适用于网络连接不可用等正常情况。
-
捕捉到异常并不意味着它会自动消失。您只是有机会清理情况并将数据重置为“稳定”状态。在这里,您只是显示一个警报并且没有采取进一步措施来纠正问题,因此异常仍然会下降并引发。
-
@Cyrille 那么我应该怎么做才能阻止它创建更多的单元格??
-
当你到达
cellForRowAtIndexPath时已经太晚了。表格视图已经需要这么多行,而实际上您的行数更少。正如其他人所说,例外是 1)这不是一个神奇的解决方案,2)不打算像那样使用 -
我想补充一点,在断言的情况下,比如'cellForRow'中的returnig nil try/catch 不会阻止应用程序崩溃,你应该防止异常并在这些情况下使用try/catch可能会发生预期的行为,例如处理文件时可能会引发 I/O 异常
标签: ios iphone objective-c uitableview exception-handling