从任何地方记录的消息中可能出现NSError?

时间:2013-10-11 07:33:51

标签: objective-c cocoa error-handling nserror

可能由消息产生的所有NSErrors是否都记录在cocoa或iOS框架中的任何位置?

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

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

(我为iOS编程)

1 个答案:

答案 0 :(得分:2)

  

可能由消息产生的所有NSErrors是否都记录在cocoa或iOS框架中的任何位置?

NSOSStatusErrorDomain的存在意味着答案是否定的,因为实际上有数千个OSStatus错误代码,并且只记录了其中的一部分。

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

  

...我正在看NSURLSession,似乎[它]没有指定可能抛出什么可能的NSError。在Apple自己的错误处理编程指南中,它使用NSDocument作为示例,但在参考文档中,它没有说明可以抛出哪些错误。

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

NSDocument示例是第一部分的一个很好的示例:您可以从字面上返回读取和写入方法中的任何错误。尝试阅读时出现任何问题(例如:损坏/错误格式,无意义数据)或写入(例如:无法创建文件;存储空间不足),您报告为错误。你甚至可以自己制作错误,那些错误完全有效。

即使在NSURLSessionDownloadTask的情况下,也可能存在一些可能出错的可想象事物,但这只意味着您将期待与Apple工程师相同的一组故障情况。什么时候(不是如果)发生了他们没想到的事情,你也不会。

“Apple从来没有说过会发生这种情况!”对于你的应用程序没有正确处理错误的理由是不好的。

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

如果您希望Apple完全完整地记录每种方法的当前和未来可能的错误,那么失望。期待不完美并计划周围。

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