Objective-C:断言与异常与错误

Tob*_*ias 79 cocoa conventions objective-c

在Cocoa中,何时应该使用NSAssert,NSException,NSError?

这就是我一直在想的:

NSAssert - 在创建任何用于程序员自身利益的客户端程序时,可以仔细检查规则,约定,假设或前置条件和后置条件?

NSException - 为了使用该库的其他程序员的利益创建第三方库,以便他们立即知道输入何时无效?

NSError - 当与外部系统连接以获取不保证给我结果的文件,数据库或Web服务等数据时?

Mik*_*ler 100

一个NSAssert失败时会抛出异常.因此,NSAssert是一种简单易用的编写方式,可以检查您在代码中所做的任何假设.它(在我看来)不是例外的替代品,只是一种捷径.如果断言失败,那么代码中的某些内容就会出现严重错误,程序不应该继续.

需要注意的一点是,NSAssert不会在发布版本中编译到您的代码中,因此这通常用于开发期间的健全性检查.我实际上倾向于使用始终处于活动状态的自定义断言宏.

你的时间@throw你自己NSException是当你肯定希望它在发布版本,并在东西像公共图书馆/接口时,一些参数是无效的,或者你已经被称为不正确.请注意,@catch异常并不是标准做法,并继续运行您的应用程序.如果您尝试使用Apple的一些标准库(例如Core Data),可能会发生不好的事情.类似于断言,如果抛出异常,应用程序通常应该很快终止,因为这意味着某处存在编程错误.

NSErrors应该在您的库/接口中用于非编程错误的错误,并且可以从中恢复.您可以向调用者提供信息/错误代码,他们可以干净地处理错误,在适当时提醒用户,并继续执行.这通常是针对File-not-found错误或其他一些非致命错误.

  • 换句话说:Obj-C的NSException == Java的Error类,以及Obj-C的NSError == Java的Exception类.万岁以保持一致性! (25认同)
  • 更强烈地说,**NSException**不应该用于表示可恢复的错误. (14认同)
  • 实际上,如果您没有在预编译的前缀文件中添加NS_BLOCK_ASSERTIONS,NSAssert将被编译到您的代码中.阅读下面的[答案](http://stackoverflow.com/a/25660769/1764735)(现在只需50分即可表达:) (2认同)