据我了解,@try/@catch
不鼓励使用块,因为exceptions
只应在不可恢复的灾难性错误中抛出(请参阅此讨论,@bbum 给出了一个很好的答案:iOS 中的异常处理)。
所以我查看了我的代码,发现了一个@try/@catch
我不知道如何摆脱的块:
NSData *fileData = [NSData dataWithContentsOfFile: ....];
NSDictionary *dictionary;
@try {
dictionary = [NSKeyedUnarchiver unarchiveObjectWithData: fileData];
}
@catch (NSException *exception) {
//....
}
@finally {
//...
}
问题是(如文档中所述)如果不包含有效存档,则会+unarchiveObjectWithData:
引发一个。NSInvalidArchiveOperationException
NSData
由于数据是由用户选择的文件提供的,因此不能保证它包含有效的存档,因此如果选择了不正确的文件,应用程序将会崩溃。
现在有两个问题:
- 如果存档无效(这似乎不符合灾难性或不可恢复的错误),为什么
+unarchiveObjectWithData:
不只返回nil
(Edit:和 an )。NSError**
- 上面的模式是否正确(使用
@try
)?我没有发现任何方法可以让我们事先检查数据是否包含有效的存档,并且没有发现使用委托协议处理这种情况的可能性。我忽略了什么?
请注意,上面的代码当然有效,我只是想知道它是否是最佳实践。