Warum sind meine C++ - exceptions, die nicht abgefangen wird?
Habe ich einige C++ - code, wird eine standard-Ausnahme-Muster:
try {
//some code that throws a std::exception
}
catch (std::exception &e) {
//handle the exception
}
Das problem ist, dass die Ausnahmen nicht abgefangen wird und ich kann nicht herausfinden, warum.
Den code kompiliert werden, um eine statische Bibliothek in OS X (via Xcode). Die Bibliothek verknüpft ist, in eine Cocoa-Anwendung mit einem Aufruf der Funktion in Frage, geschieht über eine Objektive-C++ - thunk. Ich vermute, dass das zusammenspiel zwischen Objective-C und C++ ist der Täter, aber alle meine versuche zur pin runter gescheitert.
Ich nicht in der Lage, erstellen Sie ein einfaches Beispiel, das reproduziert dieses Verhalten in einem einfachen Beispiel. Wenn ich den entsprechenden code aus dem Kontext meiner großen Programm funktioniert alles.
Kann jeder jeden schlagen, warum meine Ausnahmen, die nicht abgefangen wird?
- Welche Beweise haben Sie, um Sie, dass eine exception geworfen wird? Welche Beweise haben Sie, dass es stammt aus
std::exception
? (Nicht sagen, dass du falsch liegst, aber es gibt einen deutlichen Mangel an Informationen hier)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, eine
catch(...) {}
block, zu sehen, ob eine exception wirklich geworfen.std::exception
. Ein catch-block mit einem Auslassungszeichen (...) als parameter der catch-fangen-ohne Ausnahme-egal, was der Typ des throw-exception ist. Ähnlich wie ein "Standard" - handler.C++ ermöglicht Ihnen eine Vielzahl von Optionen für den Fang: der Wert, Referenz oder ein Zeiger.
Beachten Sie, dass dieser code nur Fänge std::exceptions per Referenz übergeben oder der Wert:
Ist es wahrscheinlich, dass die Ausnahme übergeben wird der pointer:
Überprüfen Sie den code, der das werfen der exception und sehen, wie es ist, es zu tun.
Als Mark Punkte aus, wenn Sie fangen die Wert-statt als Referenz riskieren Sie schneiden Ihr Objekt.
catch
einwandfrei funktionieren wird. Fangen von Referenz wird bevorzugt, um zu verhindern, dass exception-Objekt schneiden. Werfen ein Zeiger ist eine ganz andere Sache, dastd::exception*
ist eine ganz andere Art, alsstd::exception
.Hast du wohl Recht, obwohl es schwer auf die Spur.
Erste, GCC explizit nicht zulassen, dass Sie exceptions werfen, die in Objective C++ und fangen Sie Sie in C++ ("beim Einsatz von Objective-C++, die Objective-C-exception-Modell nicht die Interoperabilität mit C++ - Ausnahmen in dieser Zeit. Dies bedeutet, Sie können
@throw
eine Ausnahme von der Objective-C undcatch
es in C++, oder Umgekehrt (d.h.,throw
...@catch
).")Aber ich denke, Sie beschreiben einen Fall, in dem Objective-C++ - Aufrufe von C++ - code C++ - code wirft und Sie hoffen für C++ - code, um die Ausnahme zu fangen. Leider bin ich Schwierigkeiten haben, die Dokumentation für diesen speziellen Fall. Es gibt eine gewisse Hoffnung da, "Es wird angenommen, sicher zu sein, zu werfen, eine C++ - Ausnahme von einer Datei durch eine andere Datei kompiliert, die für die Java-Ausnahme-Modell, oder Umgekehrt, aber es können Fehler in diesem Bereich." Wenn Sie es tun können, die für Java gibt es eine chance, die Sie tun können, es für Objective-C++.
Zumindest, müssen Sie angeben,
-fexceptions
zur compile-Zeit ("Sie müssen aktivieren Sie diese option, wenn der C-code kompilieren muss, um richtig zusammenarbeiten mit exception-Handler in C++ geschrieben"). Wieder, das nicht speziell erwähnen, Objective C++, aber kann es anwenden.Ein wenig bekannt gotcha mit Ausnahmen bezieht sich auf den Zugriff auf die Basisklasse.
Wenn Sie tatsächlich werfen eine Klasse, die sich privat von
std::exception
dann diestd::exception
handler wird nicht gewählt werden.Beispiel:
In der Regel einer der Handler in der 'B' - handler nie gewählt, aber in diese case 'B' dervies von 'A' privat und so die catch-handler für den Typ 'A' wird nicht berücksichtigt.
Bieten kann ich zwei Theorien:
-fobjc-exceptions
hilft.Dies könnte eine lange gedreht, aber in der Visual Studio-compiler-Einstellungen gibt es eine option zum ausschalten Ausnahmen völlig. Vielleicht gibt es etwas ähnliches in GCC /XCode.
C++ - Ausnahmen kann nur über etwas, ziemlich Häufig ein
char*
. Wie vorgeschlagen, vor dem hinzufügencatch (...)
zumindest es zu brechen, und sehen, was Los ist.char*
Ausnahme und würde slap-wer verwendet einVielen Dank für den input von allen. Das sind gute Anregungen für alle, die läuft in ein ähnliches problem. Es funktioniert jetzt, aber ich bin mir nicht 100% sicher, dass die verschiedenen änderungen, die ich verursacht Dinge, um sich gesund wieder. Noch einmal der Ansatz der Vereinfachung auf etwas, das funktioniert und Gebäude zurück, von dort ausgezahlt.
Eine Sache, die nicht erwähnt in den Antworten, und das, glaube ich, war ein Teil meiner Verwirrung, ist, um sicherzustellen, dass der hf macht es offensichtlich, dass es tatsächlich fing die Ausnahme. Ich denke, dass in einigen meiner Formulierungen der Prozedur war es maskieren diese Tatsache und die Weitergabe der exception auf einer höheren Ebene-handler.