@ try @ catch块没有捕获内部异常

时间:2016-05-27 14:13:58

标签: ios objective-c objective-c-blocks objective-c-runtime

好吧,我以前从未见过这个。这是我的代码:

    @try {
        [self.avPlayer removeObserver:self forKeyPath:@"status"];
        [self.avPlayer removeObserver:self forKeyPath:@"rate"];
    } @catch (NSException *exception) {

    } @finally {

    }

你可以清楚地看到,我在@try块中有这两行代码。但是,它仍然会崩溃我的应用程序。这是未被捕获的异常消息:

  

无法移除观察者< SoulHLECellView 0x7fa8d2b536b0>关键路径"状态"来自< AVPlayer 0x7fa8d714ad70>因为它没有注册为观察员。

所以,非常清楚,这是由我上面发布的代码引起的。这怎么可能?我在这里缺少什么?

3 个答案:

答案 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]中的CoreFoundationobjc_exception_throw中的libobjc.A.dylib设置断点,并且断点可能会捕获实际异常的内容。并告诉你为什么你没有抓住它。

所有这一切,@gnasher729指出了从长远来看如何最好地处理这种情况(即你想要实际释放到世界的代码)。