2016-05-27 13 views
0

OK, ich habe das noch nie zuvor gesehen. Hier ist mein Code:@ try @ catch Block nicht innerhalb Ausnahme fangen

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

    } @finally { 

    } 

Sie können ganz klar sehen, ich habe diese 2 Zeilen Code im @try-Block. Allerdings stürzt es immer noch meine App ab. Hier ist die abgefangene Ausnahme Nachricht:

kann keinen Beobachter entfernen < SoulHLECellView 0x7fa8d2b536b0> für den Schlüsselpfad „Status“ von < AVPlayer 0x7fa8d714ad70>, weil es nicht als Beobachter registriert ist.

Also, ganz klar, das wird durch den Code verursacht, den ich oben gepostet habe. Wie zum Teufel ist das möglich? Was fehlt mir hier?

+1

Warum verwenden Sie 'try/catch'? Schreiben Sie Ihren Code so, dass Sie nur versuchen, den Beobachter zu entfernen, wenn Sie den Beobachter hinzugefügt haben. – rmaddy

+0

@rmaddy wahrheitsgemäß, weil es nicht mein Code ist und es ist dicht und ich möchte nichts brechen oder neue Bugs verursachen. –

+0

Ich kann den Fehler * auf OS X * nicht reproduzieren, alle meine Versuche können die Ausnahme abfangen. Schauen Sie sich die Stack-Spur an, die möglicherweise einen Hinweis enthält. Es gibt nichts falsch * per se * mit Ihrem Code (irgendwelche philosophischen Probleme beiseite ;-)) – CRD

Antwort

1

Um Ihre Frage zu zu beantworten, warum Sie nicht tatsächlich die Ausnahme abfangen, gibt es bestimmte Arten von Ausnahmen, die nicht abgefangen werden können; siehe http://www.cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html für eine ziemlich gute Erklärung dessen, was diese sind, was ihre Ursachen sind und was man dagegen tun kann. Ich vermute, dass die Ausnahme, die tatsächlich ausgelöst wird, eine Laufzeitausnahme ist, die Sie tatsächlich mit @try/@catch nicht behandeln können.

Um Triage, können Sie versuchen, einen Haltepunkt auf -[NSException raise] in CoreFoundation oder objc_exception_throw in libobjc.A.dylib Einstellung und mehr als wahrscheinlich, dass Haltepunkt erfassen, was die eigentliche Ausnahme und gibt Ihnen einen Anhaltspunkt, warum Sie es nicht zu kontrollieren sind.

Alles, was gesagt wird, @gnasher729 traf den Nagel auf den Kopf, wie am besten mit dieser Art von Situation auf lange Sicht (d. H. Code, den Sie tatsächlich in die Welt veröffentlichen wollen) umzugehen.

+0

Kann jemand, der diese Antwort abgelehnt hat, bitte erklären, warum? Die Frage war NICHT "Soll ich versuchen/fangen"; es war "Wie ist es möglich, dass try/catch diese Ausnahme NICHT abfängt". – fullofsquirrels

8

In Objective-C werden Ausnahmen für Programmierfehler ausgelöst. Sie fangen keine Ausnahmen. Sie beheben die Fehler in Ihrem Code.

Der Fehler in Ihrem Code ist ziemlich offensichtlich: Sie versuchen, einen Beobachter zu entfernen, der nicht existiert. Überprüfen Sie, ob Sie den Beobachter tatsächlich erstellen oder ob Sie ihn bereits entfernt haben. Rufen Sie removeObserver nur auf, wenn ein Beobachter vorhanden ist.

Verwenden Sie NICHT TRY/CATCH für diese. Wenn es eine Ausnahme gibt, lass es deine App zum Absturz bringen, finde heraus, was die Ausnahme verursacht, dann FIX YOUR BUG.

+1

Gute Antwort im Allgemeinen. In diesem Fall glaube ich nicht, dass überhaupt eine Ausnahme ausgelöst wird. – bbum

1

Eine Art "keine Antwort", basierend auf vorherigen Kommentaren.

Lassen Sie uns die philosophischen Argumente darüber überspringen, ob der Versuch/Fang sogar in der Sprache sein sollte. Warum funktioniert dein Code nicht?

Sie versuchen, eine abfangbare Ausnahme abzufangen, die Antwort @fullofsquirrels trifft nicht auf Ihren Fall zu.

Ich habe Ihren Code sowohl auf OS X und iOS (nur Simulator) getestet, beide werfen und Ausnahme, und beide ermöglichen es Ihnen, es zu fangen. Mit anderen Worten, es ist nichts falsch mit Ihrem Code per se, es ist korrekt und sollte funktionieren ...

So gibt es etwas anderes außerhalb des Bereichs des Codes, die Sie veröffentlicht haben, die das Problem verursacht. Du wirst graben müssen.

Als Ausgangspunkt können Sie die Stack-Trace betrachten und sehen, ob das einen Hinweis auf die Ursache bietet.

Fröhliche Jagd!