【问题标题】:Methods that throw an exception抛出异常的方法
【发布时间】:2011-04-27 13:25:05
【问题描述】:

在使用 Objective-C 进行编程时,我偶尔会遇到一些方法抛出我没有预料到的异常。

事后看来,我可以理解为什么它会引发异常,并且通常,解决问题会导致更好的代码。

但是,提前知道哪些方法会抛出异常以及在什么情况下会很方便。

例如:

NSString *aString;
aString = @"Less than 42 characters.";
[aString substringToIndex:42];

会抛出异常,因为字符串包含少于 42 个字符。

还有这个:

NSString *aString = @"This is a string.";
NSString *bString = nil; 
aString = [NSString stringByAppendingString:bString];

同样会崩溃,因为 bString 为 nil。

还有其他例子吗?

【问题讨论】:

  • 不完全是骗子,但几乎是:stackoverflow.com/questions/4310560/… 具体来说:不要使用异常来指示除不可恢复的错误之外的任何内容(有关详细信息,请参阅 q/a -- 底线:不要使用异常来捕获范围错误)

标签: objective-c


【解决方案1】:

但是,提前知道哪些方法会抛出异常以及在什么情况下会很方便。

它在文档中告诉您。

【讨论】:

  • 如果暗示您应该在解析代码中依赖此类异常,请不要这样做......
【解决方案2】:

虽然 Objective-C 确实支持异常,但它们很少使用。它们最大的问题是在释放对象之前跳出上下文导致的内存泄漏(尽管这在 GC 环境中不再存在问题)。

异常主要用于 Objective-C 中的致命情况,它们很少用于可恢复的错误。为此,方法传递指向指针的指针,如+[NSURLConnection sendSynchronousRequest:returningResponse:error:]

因此,只要文档没有明确说明异常,您就不需要太在意它们。

您的第一个示例总是会抛出异常顺便说一句,因为 NSString 没有方法 subString:

【讨论】:

  • 如果你使用 GC,不要认为内存泄漏不再是问题。 malloced 和释放的内存仍然可能泄漏,CF 对象和文件描述符也是如此。
  • @JeremyP:对,忽略了这一点。 GC 无论如何都是娘娘腔的 ;-)
  • 不使用异常的原因还有很多,最大的原因是在调用框架时抛出异常是未定义的行为。顺便说一句:在许多常见情况下,Mac OS X GC 实际上比非 GC 代码更快。更快、更小的内存占用以及更少的代码让我维护?是的,请。
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
相关资源
最近更新 更多