@try {
[self.avPlayer removeObserver:self forKeyPath:@"status"];
[self.avPlayer removeObserver:self forKeyPath:@"rate"];
} @catch (NSException *exception) {
} @finally {
}
你可以清楚地看到,我在@try块中有这两行代码。但是,它仍然会崩溃我的应用程序。这是未被捕获的异常消息:
无法移除观察者< SoulHLECellView 0x7fa8d2b536b0>关键路径"状态"来自< AVPlayer 0x7fa8d714ad70>因为它没有注册为观察员。
所以,非常清楚,这是由我上面发布的代码引起的。这怎么可能?我在这里缺少什么?
答案 0 :(得分:7)
在Objective-C中,编程错误会引发异常。你不要抓住例外。您修复了代码中的错误。
代码中的错误非常明显:您尝试删除不存在的观察者。检查您是否确实创建了观察者,或者您是否已将其删除。如果有观察者,只调用removeObserver。
请勿使用TRY / CATCH。当有异常时,让它崩溃您的应用程序,找出导致异常的原因,然后修复您的BUG。
答案 1 :(得分:1)
根据之前的评论,有一种“没有答案”#34;
让我们跳过关于try / catch是否应该在语言中的哲学论点。为什么你的代码不起作用?
您正试图抓住一个可捕获的异常,@ fulllofsquirrels的答案不适用于您的情况。
我已经在OS X和iOS(仅限模拟器)上测试了您的代码,包括throw和exception,并且都允许您捕获它。换句话说,您的代码本身没有任何问题,它是正确的,应该有效......
因此,您发布的导致问题的代码范围之外还有其他内容。你必须挖掘。
作为起点,您可以查看堆栈跟踪,看看是否提供了有关原因的任何线索。
快乐狩猎!
答案 2 :(得分:0)
要回答关于为什么您实际上并未捕获异常的问题,有些类型的异常无法捕获;请参阅http://www.cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html,了解这些是什么,它们的原因是什么,以及如何应对它们。我怀疑实际上被抛出的异常是一个运行时异常,你无法用@try/@catch
实际处理。
要进行分类,您可以尝试在-[NSException raise]
中的CoreFoundation
或objc_exception_throw
中的libobjc.A.dylib
设置断点,并且断点可能会捕获实际异常的内容。并告诉你为什么你没有抓住它。
所有这一切,@gnasher729指出了从长远来看如何最好地处理这种情况(即你想要实际释放到世界的代码)。