抛出异常的方法
Posted
技术标签:
【中文标题】抛出异常的方法【英文标题】: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。
还有其他例子吗?
【问题讨论】:
不完全是骗子,但几乎是:***.com/questions/4310560/… 具体来说:不要使用异常来指示除不可恢复的错误之外的任何内容(有关详细信息,请参阅 q/a -- 底线:不要使用异常来捕获范围错误) 【参考方案1】:但是,提前知道哪些方法会抛出异常以及在什么情况下会很方便。
它在文档中告诉您。
stringbyAppendingString substringToIndex【讨论】:
如果暗示您应该在解析代码中依赖此类异常,请不要这样做......【参考方案2】:虽然 Objective-C 确实支持异常,但它们很少使用。它们最大的问题是在释放对象之前跳出上下文导致的内存泄漏(尽管这在 GC 环境中不再存在问题)。
异常主要用于 Objective-C 中的致命情况,它们很少用于可恢复的错误。为此,方法传递指向指针的指针,如+[NSURLConnection sendSynchronousRequest:returningResponse:error:]
。
因此,只要文档没有明确说明异常,您就不需要太在意它们。
您的第一个示例总是会抛出异常顺便说一句,因为 NSString 没有方法 subString:
。
【讨论】:
如果你使用 GC,不要认为内存泄漏不再是问题。malloc
ed 和释放的内存仍然可能泄漏,CF 对象和文件描述符也是如此。
@JeremyP:对,忽略了这一点。 GC 无论如何都是娘娘腔的 ;-)
不使用异常的原因还有很多,最大的原因是在调用框架时抛出异常是未定义的行为。顺便说一句:在许多常见情况下,Mac OS X GC 实际上比非 GC 代码更快。更快、更小的内存占用以及更少的代码让我维护?是的,请。以上是关于抛出异常的方法的主要内容,如果未能解决你的问题,请参考以下文章