Objective-C:断言 vs. 异常 vs. 错误

标签 objective-c cocoa conventions

在 Cocoa 中,我应该什么时候使用 NSAssert、NSException、NSError?

这是我一直在想的:

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

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

NSError - 当与外部系统交互以获取文件、数据库或 Web 服务等数据时,不能保证给我一个结果?

最佳答案

NSAssert 在失败时会抛出异常。所以 NSAssert 有一种简短而简单的方法来编写和检查您在代码中所做的任何假设。它不是(在我看来)异常(exception)的替代方案,只是一条捷径。如果断言失败,那么您的代码中出现了严重错误,程序不应继续。

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

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

NSErrors 应该在您的库/接口(interface)中用于不是编程错误并且可以从中恢复的错误。您可以向调用者提供信息/错误代码,他们可以干净地处理错误,在适当时提醒用户并继续执行。这通常用于文件未找到错误或其他一些非 fatal error 。

关于Objective-C:断言 vs. 异常 vs. 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009597/

相关文章:

objective-c - 是否可以将 NSTableview "wrap"单元格放入新列?

Lua 分号约定

objective-c - EXC_BAD_ACCESS 访问结构体变量时出现运行时异常->Objective C

objective-c - 无法在 Swift 中正确地将参数传递给 CFSwapInt16LittleToHost

objective-c - 如何创建一个 UIButton 以显示与 UIBarButtonItem 相同的效果?

iOS:从不同的选择器中获取日期和时间并将它们加在一起?

c++ - 如何将复杂的 C++ XCode 项目转换为 Cocoa 应用程序?

c - 良好做法:非变异函数何时应要求使用指针而不是副本?

linux 脚本,标准目录位置

objective-c - 无法获取 Collection View 的选定项目