数组为空时的错误处理

时间:2013-06-17 09:23:16

标签: ios objective-c error-handling nsarray

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self getLoadingTableCellWithTableView:tableView];

    RssItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RssItemCell"];
    // If break in here, url fetch maybe error or row is null
    RssItem *feed = [[self.manager.feeds objectForKey:self.manager.currentChannel] objectAtIndex:indexPath.row];

    cell.title.text = feed.title;
    cell.description.text = feed.description;
    cell.date.text = feed.date;
    // if any image enclosure at rss parse
    [cell.enclosure setImage:[UIImage imageNamed:@"logo.png"]];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue,
                   ^{
                       UIImage *image = [[UIImage alloc] initWithData:feed.enclosure];
                       [cell.enclosure  setImage:image];
                       [cell setNeedsLayout];
                   });

    return cell;
}

当我尝试获取空行RSS(我的网络类别中没有帖子)时,我遇到了问题

我想显示提醒并自动转到主页。

被困在这里。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self getLoadingTableCellWithTableView:tableView];

    RssItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RssItemCell"];
    @try {
        NSLog(@"Trying to tetch");
        // If break in here, url fetch maybe error or empty row
        RssItem *feed = [[self.manager.feeds objectForKey:self.manager.currentChannel] objectAtIndex:indexPath.row];
        cell.title.text = feed.title;
        cell.description.text = feed.description;
        [cell.enclosure setImage:[UIImage imageNamed:@"logo.png"]];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
        dispatch_async(queue,
                       ^{
                           UIImage *image = [[UIImage alloc] initWithData:feed.enclosure];
                           [cell.enclosure  setImage:image];
                           [cell setNeedsLayout];
                       });

        return cell;

    }
    @catch (NSException *e) {
        NSLog(@"catching %@ reason %@", [e name], [e reason]);
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"%@",e] delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];

        TableViewController *VC = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
        [self presentViewController:VC animated:YES completion:nil];
    }
    @finally {
        NSLog(@"finally");
    }
}

警告不会出现并转到断点。我该如何处理这个错误?

1 个答案:

答案 0 :(得分:2)

首先,您必须始终在cellForRowAtIndexPath:返回UITableViewCell *。其次,这通常是一种不好的做法(请参阅下面的引文),特别是因为您可能会多次显示一些警报并显示TableViewController。作为一个问题解决方案,似乎没有例外,这让我觉得self.manager.feeds实际上是nil


Programming with Objective-C

  

您不应使用try-catch块代替标准编程   检查Objective-C方法。在NSArray的情况下,为   例如,您应该始终检查数组的计数以确定   尝试访问给定索引处的对象之前的项目数。   如果你创建一个,objectAtIndex:方法会抛出异常   越界请求,以便您可以尽早在代码中找到错误   在开发周期中 - 你应该避免抛出异常   您发送给用户的应用。

     

有关Objective-C应用程序中的异常的更多信息,请参阅   Exception Programming Topics