我遇到了iOS(和OS X)的情况,当他们试图取消归档损坏的存档时,来自NSKeyedUnarchiver的异常导致仅使用二进制的第三方框架导致我的应用程序崩溃(在部署时在现场) ,从而迫使用户删除并重新安装该应用程序。这种情况并不经常发生,但我希望这个数字为零。
我无法通过包装NSKeyedUnarchiver调用解决问题,因为我没有源代码,因为这些调用不是我的代码所做的任何事情的直接结果;它们在任意时间运行在任意背景线程上。
我目前正在调查NSKeyedUnarchiver类,以便读取损坏的存档返回nil(好像文件不在那里)而不是抛出异常,但我无法确定是否有任何第三个-party框架可能会正确地执行操作(使用@ try / @ catch块),如果我这样做,可能会以有趣的方式破解。
如果我可以以某种方式检查Objective-C异常处理树(或等效物)来确定异常处理程序是否会在抛出时捕获异常,如果是这样,哪个处理程序将是有帮助的。这样,我的修补方法可以返回nil,如果异常会使它一直到Crashlytics(这将重新抛出它,导致崩溃),但如果其他一些处理程序会捕获它,可以重新抛出异常。
这样的事情是否可能,若然,怎么样?
答案 0 :(得分:1)
为什么不在try / catch / finally中包装抛出异常的callsite?
@try {
//call to your third party unarchiver
}
@catch {
//remove your corrupted archive
}
@finally {
//party
}
滚动你自己的全局异常处理程序也可以在这里使用,ala:How do you implement global iPhone Exception Handling?
答案 1 :(得分:0)
如果你不确定用@try/@catch
包装第三方库代码是否足够好,你可以挂钩NSKeyedUnarchiver
方法用完全相同的包装器替换它们,从而确保永远不会抛出异常外。这是伪代码:
@try {
//call original NSKeyedUnarchiver implementation
}
@catch {
return nil;
}
Objc runtime has public APIs可以做这样的事情