可能来自任何地方记录的消息的 NSError?

Posted

技术标签:

【中文标题】可能来自任何地方记录的消息的 NSError?【英文标题】:Possible NSError from a message documented anywhere? 【发布时间】:2013-10-11 07:33:50 【问题描述】:

是否所有可能由消息导致的 NSErrors 都记录在可可或 ios 框架的任何地方?

是的,NSErrors 的类型被划分为不同的域,但我仍在查看 NSURLSession ,并且似乎 (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler 之类的消息没有指定可能抛出的 NSError 。在 Apple 自己的错误处理编程指南中,它使用了NSDocument 作为示例,但在参考文档中也没有说明可以抛出哪些错误。

我错过了什么吗?程序员如何提前知道可能发生的错误类型?还是程序通常只是捕获所有内容并通过警报将它们返回给用户?

(我为 iOS 编程)

【问题讨论】:

【参考方案1】:

是否所有可能由消息导致的 NSErrors 都记录在可可或 iOS 框架的任何地方?

NSOSStatusErrorDomain 的存在意味着答案是否定的,因为实际上有成千上万个 OSStatus 错误代码,而其中只有一小部分被记录在案。

不过,Apple 提供的其他域中的大多数(如果不是全部)错误都已记录在案。您应该能够简单地获取错误的本地化描述、本地化失败原因或本地化恢复建议,以获取(理论上)适合向用户显示的错误描述。

...我正在查看说 NSURLSession ,似乎 [it] 没有指定可能抛出的 NSError 。并且在苹果自己的错误处理编程指南中,它以 NSDocument 为例,但在参考文档中也没有说明可以抛出哪些错误。

这组可能的错误很少受到限制,而且通常是一个移动的目标。

NSDocument 示例是第一部分的一个很好的示例:您可以从 read 和 write 方法返回任何错误。在尝试读取(例如:损坏/错误的格式、无意义的数据)或写入(例如:无法创建文件;存储空间不足)时出现任何问题,您将报告为错误。您甚至可以自己编造错误,这些错误完全可以从那里返回。

即使在 NSURLSessionDownloadTask 的情况下,也可能有一些有限的可想象的事情可能出错,但这只是意味着您会期待与 Apple 工程师相同的失败案例。当(不是如果)他们没有预料到的事情发生时,你也不会发生。

“Apple 从未说过这会发生!”是你的应用程序没有正确处理错误的一个糟糕的借口。

而且“从不”可能不是真的:正如我所提到的,这组可能的错误可能是一个移动的目标。这意味着 Apple 可能会在以后扩展该集合,要么是因为他们忘记了一个(它确实发生了),要么是因为他们后来确实添加了其他可能的错误(新代码或只是新处理的案例)。

如果您希望 Apple 能够完美地完整记录每个方法的当前和未来可能出现的错误集,那么您感到失望。期待不完美并围绕它制定计划。

如果您收到错误,您需要能够处理 ANY 错误。从任何可以恢复的情况中恢复,确保所有可预见的不可恢复的情况都有合理的错误消息(如果还没有的话),并通过在警报中填充其本地化描述/失败原因/恢复建议来处理其他任何事情。

【讨论】:

以上是关于可能来自任何地方记录的消息的 NSError?的主要内容,如果未能解决你的问题,请参考以下文章

如何注册用户的 ios 设备以接收来自 AppDelegate 以外的地方的推送消息?

如何从 1 个地方在生产版本中记录崩溃报告

创建一个 NSError 域

如何确保 HTTP_REQUEST 来自正确的地方?

来自 HTTP 状态码的 NSError

有没有地方可以在线托管您的代码?