【发布时间】:2015-11-14 11:15:45
【问题描述】:
我在 iOS(和 OS X)中遇到了一种情况,当他们尝试解压缩损坏的存档时,来自 NSKeyedUnarchiver 的异常会导致纯二进制第三方框架崩溃我的应用程序(当部署在现场时),因此强制用户删除并重新安装应用程序。这种情况不会经常发生,但我希望这个数字为零。
我无法通过包装 NSKeyedUnarchiver 调用来解决问题,因为我没有源代码,而且这些调用不是我的代码所做的任何事情的直接结果;它们在任意时间在任意后台线程上运行。
我目前正在调整 NSKeyedUnarchiver 类,以便读取损坏的存档返回 nil(好像文件不存在)而不是抛出异常,但我不能确定是否有任何第三方框架可能正确地做事(使用@try/@catch 块),如果我这样做,可能会以有趣的方式中断。
如果我能以某种方式检查 Objective-C 异常处理树(或等效的)以确定异常处理程序是否会在抛出异常时捕获异常,以及如果是,那将是有帮助的。这样一来,如果异常会一直持续到 Crashlytics(它会重新抛出它,导致崩溃),我的修补方法可能会返回 nil,但如果其他处理程序捕获它,则可能会重新抛出异常。
这样的事情有可能吗,如果有,怎么做?
【问题讨论】:
-
你试过 Xcode stackoverflow.com/questions/17802662/… 吗?
-
我认为真正需要解决的问题是存档损坏。
-
当一个应用程序拥有超过一百万的活跃用户时,你肯定会在一个月内遇到至少一到两次 NSKeyedArchiver 故障,这只是随机的厄运(RAM 不稳定、CPU 故障、宇宙射线、 API 中的错误、malloc 内存池的随机损坏、有缺陷的闪存块等)。所以保证档案没有损坏是不切实际的(而且因为我正在使用闭源框架,我什至无法获得所有可能的档案的列表来预先扫描它们是否损坏)。
-
问题不是在调试过程中捕获异常;问题是试图确保现场的真实用户不会因为某些随机广告 API 使用的一些随机数据而无法启动应用程序,这些数据对应用程序的功能并不重要。基本上,我试图尽量减少一些糟糕的第三方代码给用户带来的痛苦。
标签: ios objective-c