NSException和NSError自定义异常/错误

13

我最近开始学习Objective-C,正在开发一个iOS应用作为练习。我想通过抛出异常来处理溢出(我来自Java的背景),我搜索了文献资料,只找到了NSException,但在异常处理部分,他们建议使用NSError。我阅读了参考资料,但它们具有相同的协议和方法,那么它们之间有什么区别?哪个更好?

此外,我想创建自己的异常或错误类,是否应包含任何方法或字段?(例如,在Java中实现Exception接口时)。 谢谢

1个回答

23

NSError旨在处理非致命、可恢复的错误。它被设计用于捕获那些通常是用户错误(或者是可以呈现给用户的错误),可以经常从中恢复(因此有-presentError:NSErrorRecoveryAttempting),并且通常是预期的或可预测的错误(例如尝试打开没有访问权限的文件,或者尝试在不兼容的字符串编码之间进行转换)。

NSException是为可能致命的程序员错误而设计的。这些错误旨在表示应用程序中潜在的缺陷,在这些缺陷中,您没有正确检查执行某些操作的前提条件(例如尝试访问超出其边界的数组索引或尝试改变不可变对象)。异常编程指南的介绍对此进行了一些解释。


1
是的,如果这是一种不应该出现在正确代码中的意外情况。 - 一二三
2
NSException 的子类很少见:通常通过名称(使用 +exceptionWithName:reason:userInfo:)而不是它们的类来区分异常。但是,您可以将任何类型的对象(NSStringNSObject 或其他任何类型)作为异常 @raise,没有特殊的接口要求(尽管这并不推荐)。 - 一二三
因此,在这方面,NSError == Java checked exception,NSException == Java unchecked exception(RuntimeException)。 - nbransby
Objective-C 没有受检异常(checked exceptions),而且 NSError 不会触发异常处理程序。 - 一二三
1
更像是NSError == Java中的未检查异常,NSException == Java中的错误。 - awiebe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接