【问题标题】:objective-c iphone programming : try catch exceptionsObjective-C iphone 编程:尝试捕获异常
【发布时间】:2011-07-23 00:59:10
【问题描述】:

我使用 kumulos 访问数据库。 这是我正在谈论的代码:

NSString *location = [[theResults objectAtIndex:0] objectForKey:@"location"];

现在,如果 [theResults objectatindex:0] 返回“null”,它每次都会崩溃 因此,如果用户输入的内容不在数据库中,它就会崩溃,我想捕捉这个异常(NSRange 异常)。

谢谢

【问题讨论】:

  • 如果 [theResults objectAtIndex:0] 为 nil,它不应该崩溃。应该发生的只是 location 本身变为 nil 。 Objective-C 允许每个 [nil 不管] 方法调用并且它们都返回 nil,所以请仔细检查是否确实如此?我打赌你不是,但请随时给我惊喜:)
  • 是的。 location 变为 nil,然后他尝试使用 location,我猜,在一些最终试图取消引用指针的代码中:)
  • NSRangeException 也有可能发生,因为 [theResults count] == 0。
  • 您确实不想要捕获范围异常。要么弄清楚为什么你的数组是空的

标签: iphone objective-c exception try-catch nsrange


【解决方案1】:

我认为这对你有用,不需要异常处理。

if ([theResults count] > 0) {
    NSString *location = [[theResults objectAtIndex:0] objectForKey:@"location"];
}

我假设theResults 是NSArray(或子类)。

【讨论】:

  • 如上所述,[nil foo] 不会崩溃,它会返回 nil,因此您的建议没有必要。问题是为什么他的代码一开始就崩溃了。我想是稍后他在不能为零的情况下使用位置信息的时候,但我可能是错的。
  • if (row!=nil) 检查不是必需的,此外 - 如果 row 为 nil,那么您的位置变量(可能会在之后使用)将包含垃圾。所以你需要用 nil 初始化它或者只写 NSString* location = [row objectForKey:@"location"];没有多余的检查
  • 我想你们都在看我之前的回答。我已经删除了不必要的行!= nil 检查。我认为代码崩溃了,因为他正在处理一个空的 theResults 数组。
  • 啊,当然。如果数组为空,他会得到一个范围异常(这也是他得到的...... d'oh,我的错)。
【解决方案2】:

要么检查 [theResults objectAtIndex:0] 不返回 nil,要么使用异常处理

@try {
   NSString *location = [[theResults objectAtIndex:0] objectForKey:@"location"];  
}
@catch (NSRangeEception * e) {
   NSLog(@"catching %@ reason %@", [e name], [e reason]);
}
@finally {
   //something that you want to do wether the exception is thrown or not.
}

不过,我建议至少学习一下这门语言,或者用 google 练习一下 :-)

【讨论】:

  • 你确实不在 iOS 中使用异常处理来捕获处理并继续。框架抛出的异常表示通常由代码错误引起的不可恢复的错误。对于数组,如果存在内容问题,您可以使用count 方法来检查索引处对象的存在,并且从不为此使用异常处理。
  • 这绝对不是要走的路。他所要做的就是检查 [theResults count] 是否为 0。
  • 1.问题是:“我如何捕捉 NSRangeException”?答案是@try @catch,或者什么 2. 如果您使用带有超出范围的索引的 objectAtIndex,则会引发 NSRangeException 异常,而不会在代码中出现一些灾难性的错误。你应该使用count,没错,但我在@catch 中没有看到那个大错误。 3. 鉴于这些前提,我认为两个沮丧是没有道理的,但谁在乎呢。
  • 我还想补充一点,如果你真的反对使用异常,你应该解释一下:不解释就说“nonono 那肯定是错误的”。
  • 我完全同意你的观点 garph0。我什至尝试撤消我的否决票,但除非您编辑答案,否则它已锁定到位。我首先投反对票的原因是因为用户要求解决崩溃问题,并且假设他们需要例外,但我怀疑任何知道他们在做什么的人都会使用例外在这种情况下。例外情况是您无法事先预测的事情。空数组不是这些情况之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2021-12-13
  • 2011-12-05
  • 2014-05-11
  • 1970-01-01
  • 2016-05-09
相关资源
最近更新 更多