@try@catch 块不捕获内部异常

@try@catch block not catching inside exception

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

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

    } @finally {

    }

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

Cannot remove an observer <SoulHLECellView 0x7fa8d2b536b0> for the key path "status" from <AVPlayer 0x7fa8d714ad70> because it is not registered as an observer.

很明显,这是由我在上面发布的代码引起的。这怎么可能?我在这里错过了什么?

在Objective-C中,编程错误会抛出异常。您不会捕获异常。您修复了代码中的错误。

您的代码中的错误非常明显:您试图删除一个不存在的观察者。检查你是否真的创建了观察者,或者你是否已经删除了它。只有在有观察者的情况下才调用 removeObserver。

不要为此使用 TRY / CATCH。当出现异常时,让它让你的应用程序崩溃,找出导致异常的原因,然后修复你的错误。

要回答您关于 为什么 您实际上没有捕获异常的问题,有些类型的异常是无法捕获的;请参阅 http://www.cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html 以很好地解释这些是什么、它们的原因是什么以及如何处理它们。我怀疑实际抛出的异常是一个 运行time 异常,你实际上无法用 @try/@catch.

处理

要进行分类,您可以尝试在 CoreFoundation 中的 -[NSException raise]libobjc.A.dylib 中的 objc_exception_throw 上设置断点,断点很可能会捕获实际的内容例外是并给你一个线索,告诉你为什么你没有抓住它。

综上所述,@gnasher729 关于如何最好地处理这种情况的长 运行(即您要实际发布到的代码世界)。

一种 "none answer",基于之前的评论。

让我们跳过关于 try/catch 是否应该在语言中的哲学争论。为什么您的代码不起作用?

您正在尝试捕获可捕获的异常,@fullofsquirrels 的回答不适用于您的情况。

我已经在 OS X 和 iOS(仅限模拟器)上测试了您的代码,包括抛出和异常,并且都允许您捕获它。换句话说,您的代码 本身 没有任何问题,它是正确的并且应该可以工作...

因此,您发布的代码范围之外的其他原因导致了该问题。你必须挖掘。

作为起点,您可以查看堆栈跟踪,看看它是否提供了有关原因的任何线索。

狩猎愉快!