从[NSObject removeObserver:forKeyPath:]捕获异常是否安全?

6

我有一些代码在大量使用KVO,并且在多个地方使用addObserver:forKeyPath:removeObserver:forKeyPath:。应用程序偶尔会崩溃并显示“无法删除键路径的观察者”。

我想知道是否可以安全地尝试捕获异常以防止应用程序崩溃。我知道这不是处理KVO的最佳方法,但我需要在清理代码之前先争取一些时间。


2
你应该先尝试理解失败的本质,并决定是否可以忽略它。如果你决定这样做,可以使用try/catch:https://dev59.com/questions/vHI-5IYBdhLWcg3w-9wK - Tala
2个回答

5

是的,使用@try @catch来解决这种KVO冲突问题是完全可以接受的。

例如:

@try {
        [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIDeviceProximityStateDidChangeNotification];
    }
@catch (NSException *exception) {
        // observer doesn't exist, do nothing
    }

生产环境下的代码安全性是非常重要的,苹果公司建议采用适当的异常处理模式来确保代码的稳定性。


旧话题,但已弃用的官方文档链接为https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOBasics.html#//apple_ref/doc/uid/20002252-178612。 - kikeenrique

5

异常,特别是来自内部苹果API的异常,永远不应该被默默地捕获和忽略。在Objective-C中,异常通常会导致应用程序终止,而其他语言和运行时(如Java、.NET)则将捕获异常作为开发的正常部分。

如果您遇到崩溃,那么某处存在错误,您需要修复它。吞掉异常可能会由于进入一种不一致的状态而产生严重后果。不要这样做。


1
您的建议是即使需要额外的时间和推迟发布,也要清理代码吗?就像我提到的那样,我确实理解需要修复我的代码。只是在这一点上,我试图计算经济效益。谢谢。 - Jiho Kang
1
@JihoKang,所以你想发布一个明显有bug的应用程序吗?你知道这会产生什么影响吗?现在应用程序正在崩溃;当你吞掉异常时,你认为你的应用程序会怎样? - Abizern
@Abizern 我正在处理的项目时间非常紧迫,而且崩溃错误(根据测试人员的反馈)只会在不到5%的情况下发生。我已经编写了代码,以便在由于时间问题导致一个已经从KVO注销的对象尝试再次注销的情况下进行处理。我已经测试了捕获“无法删除键路径的观察者”异常而没有“据我所见”的副作用,但是我只是想知道这个问题有多严重。毕竟,正如Mike提到的那样,这是Java中的常见做法。 - Jiho Kang
@JihoKang 你没在写Java。不过,这是你的选择。 - Abizern
2
@Abizern 抱歉,我不同意这个观点,而是同意 NSHipster (Mattt Thompson) 的文章 - Mazyod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接