【发布时间】:2018-02-01 03:01:44
【问题描述】:
从其他问题,我可以看到建议NSError用于可恢复的错误,@throw/@catch/@finally和NSException应该用于致命错误。
这对我来说毫无意义。为什么要使用NSException 来处理致命错误? 关键是他们可以被抓到!如果抓到他们不是重点,那为什么还有@try/@catch系统呢?为什么不只是NSLog、exit(1),然后就结束了?
NSError 也很笨拙,这让我更喜欢@throw/@catch/@finally
是什么激励使用其中一个而不是另一个?
【问题讨论】:
-
你在内部做什么是你的事。但是 NSException 并不那么容易被捕获。假设你的代码是从 Swift 中使用的。 Swift 程序员可以捕获你的 NSError 但不能捕获你的 NSException。
-
@matt “没那么容易被抓住。”为什么?是的,我知道 Swift 不支持
NSException,这对我来说也毫无意义。我最好的猜测是 NSError 已经是主要的错误处理机制,所以没有必要实现对在 swift 中捕获 NSException 的支持。但这并不能解释为什么 NSError 在 Swift 之前占主导地位。 -
假设 Cocoa 抛出一个 NSException。通常发生的不是你抓住它;而是你抓住了它。通常发生的事情是你崩溃了。但是当 Cocoa 给你一个 NSError 时,它会向你发送一条消息,解释为什么它不能返回请求的值。这些是 Cocoa 设计模式。
-
那么 NSError 占主导地位是因为它更容易被忽略?
-
@Alexander 它可以被忽略的事实是语言规则的副产品,而不是框架的约定(例如,如果 Obj-C 像 Swift 那样有错误规则,你就不会可以忽略它们)。也可以在 Matt 的回答中查看我的 cmets — 这里的主要区别在于,一个是针对 programmer 错误,另一个是针对正常运行时的“预期”错误。
标签: objective-c try-catch nserror nsexception