小编Mar*_*rio的帖子

NSKeyedUnarchiver - 需要尝试/捕获吗?

据我所知,@try/@catch不鼓励使用块,因为exceptions只应抛出不可恢复的灾难性错误(请参阅本讨论,并提供@bbum的好答案:iOS中的异常Handeling).

所以我查看了我的代码并发现了一个@try/@catch我不知道如何摆脱的块:

NSData *fileData = [NSData dataWithContentsOfFile: ....];

NSDictionary *dictionary;

@try {
   dictionary = [NSKeyedUnarchiver unarchiveObjectWithData: fileData];
}
@catch (NSException *exception) {
   //....
}
@finally {
  //...
}
Run Code Online (Sandbox Code Playgroud)

问题是(如文档中所述)+unarchiveObjectWithData:会引发一个NSInvalidArchiveOperationExceptionif NSData不包含有效存档的情况.

由于数据是由用户选择的文件提供的,因此无法保证它包含有效的存档,因此如果选择了错误的文件,应用程序将崩溃.

现在有两个问题:

  1. 如果存档无效,为什么不+unarchiveObjectWithData:返回nil(编辑:和a NSError**)(这似乎不符合灾难性或不可恢复的错误).
  2. 上面的模式是否正确(使用@try)?我找不到任何方法可以让我们事先检查数据是否包含有效的存档,并且发现无法使用委托协议处理这种情况.Antyhing我忽略了?

请注意,上面的代码当然有效,我只是想知道它是否是最佳实践.

exception objective-c try-catch nskeyedunarchiver

20
推荐指数
2
解决办法
4970
查看次数