抛出异常的方法

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

以上是关于抛出异常的方法的主要内容,如果未能解决你的问题,请参考以下文章

java-异常处理和线程的一些简单方法及使用

关于java异常抛出与返回值

Java中的异常的捕获和抛出是啥意思,有啥区别

当您的方法签名不允许抛出异常时如何抛出异常?

异常处理抛出异常

Java程序中的异常应该在啥时候抛出