iphone dev - 如何捕获异常'NSRangeException'

Posted

技术标签:

【中文标题】iphone dev - 如何捕获异常\'NSRangeException\'【英文标题】:iphone dev - how to catch exception 'NSRangeException'iphone dev - 如何捕获异常'NSRangeException' 【发布时间】:2010-05-19 17:18:05 【问题描述】:

在我的应用程序中,我尝试在更新表格内容后将 UITableView 滚动到顶部一次。但是,在某些情况下,我的表是空的。所以我得到了以下异常:

由于未捕获的异常“NSRangeException”而终止应用,原因:“-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: 第 (0) 节的行 (0) 超出边界 (0)。”

我怎样才能捕捉到这个异常?我试过了

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

if (indexPath != nil) 
    [EventTable scrollToRowAtIndexPath:indexPath
                atScrollPosition:UITableViewScrollPositionTop animated:YES];

但它没有捕获异常,因为 indexPath 不是 nil。

【问题讨论】:

【参考方案1】:

在滚动到 IndexPath 之前,请检查您的 UITableView 以确保您尝试滚动到的行数和节数分别小于表中的行数和节数。如果是这样,请不要尝试滚动到该 IndexPath。

if ( [tableView numberOfSections] < section || [tableView numberOfRowsInSection] < row )

【讨论】:

谢谢。我就是这样做的。 if (([EventTable numberOfSections] > 0) && ([EventTable numberOfRowsInSection: 0] > 0)) [EventTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; @S.P 这取决于您是在测试是否滚动,还是测试是否中止。 不应该是if ([tableView numberOfSections] - 1 &lt; artistsSection || [tableView numberOfRowsInSection: artistsSection] - 1 &lt; artistsRow)所以我们认为索引是从0开始的吗?【参考方案2】:

异常处理采用与典型流控制表达式不同的路径。 Apple 在Objective-C Exception Handling 上写了一篇有用的文章。本质上,您需要将代码包装在 @try/@catch 块中。它位于@catch 块中,您将在其中收到异常并在代码中执行相应的后续步骤。

【讨论】:

@try/@catch 有效,但我总是尽量避免使用它。我认为最好避免异常而不是在它发生时捕获它=)但是谢谢 同意-您的问题是专门询问如何捕获异常,而不是如何避免异常;我正试图为你回答这个问题。 文章链接已更改:developer.apple.com/library/mac/#documentation/cocoa/conceptual/… 文章链接又变了:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…

以上是关于iphone dev - 如何捕获异常'NSRangeException'的主要内容,如果未能解决你的问题,请参考以下文章

MPlatformAppInvitesJSDialog 未捕获错误:发生缩小的异常

iPhone核心数据示例产生异常

未捕获的异常:CALayer 位置在做动画时包含 NaN

iphone中的异常抛出JSON支持程序

如何捕获位置警报响应iphone

如何解决使用 iphone 4s、ipad 2 以 60fps 录制视频时出现的问题?