是否可以确定是否会捕获Objective-C异常?

时间:2015-08-20 17:26:13

标签: ios objective-c

我遇到了iOS(和OS X)的情况,当他们试图取消归档损坏的存档时,来自NSKeyedUnarchiver的异常导致仅使用二进制的第三方框架导致我的应用程序崩溃(在部署时在现场) ,从而迫使用户删除并重新安装该应用程序。这种情况并不经常发生,但我希望这个数字为零。

我无法通过包装NSKeyedUnarchiver调用解决问题,因为我没有源代码,因为这些调用不是我的代码所做的任何事情的直接结果;它们在任意时间运行在任意背景线程上。

我目前正在调查NSKeyedUnarchiver类,以便读取损坏的存档返回nil(好像文件不在那里)而不是抛出异常,但我无法确定是否有任何第三个-party框架可能会正确地执行操作(使用@ try / @ catch块),如果我这样做,可能会以有趣的方式破解。

如果我可以以某种方式检查Objective-C异常处理树(或等效物)来确定异常处理程序是否会在抛出时捕获异常,如果是这样,哪个处理程序将是有帮助的。这样,我的修补方法可以返回nil,如果异常会使它一直到Crashlytics(这将重新抛出它,导致崩溃),但如果其他一些处理程序会捕获它,可以重新抛出异常。

这样的事情是否可能,若然,怎么样?

2 个答案:

答案 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可以做这样的事情