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 < artistsSection || [tableView numberOfRowsInSection: artistsSection] - 1 < 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'的主要内容,如果未能解决你的问题,请参考以下文章