Exception Handling: Fehler werden nur manchmal gecatched :-(((
-
OK Leute,
nun fall ich so kurz vor Weihnachten noch vom Stuhl:
Platform: Win XP, Visual Studio 2010 Express
Problem: Execption Handling funktioniert nicht mehr

Meine Main sieht (reduziert) wie folgt aus. Hier klappt das Schmeißen eines Fehlers!
int main(int argc, char* argv[]) { try { vector<int> intvec; cout << intvec.at(2); // FEHLER WERFEN FUNKTIONIERT } catch(exception& ex) { cout << "Exception:" << endl; cout << ex.what() << endl; return -1; } return 0; }Wenn ich die zwei Zeilen mit dem Vector an anderen Stellen meines Programms hinkopiere (Projekt besteht aus 5 Teilprojekten) wird der Fehler mal gefangen und mal nicht gefangen und das Programm stürzt ab.
Ich schmeiße die Fehler in verschiedenen Konstruktoren und kann beim besten Willen keinen Unterschied ausmachen, wieso es mal klappt und mal nicht. Das gesamte Programm wird aus dem try-Block aufgebaut, es gibt also keine Chance zu entkommen.
Wonach könnte ich den Suchen???
Vielen Dank!
-
Bist Du sicher, dass es an der Stelle im Code liegt, dass das Programm nicht wie erwartet läuft?
Für mich klingt das stark nach UB, und das Problem liegt vermutlich woanders. Bist Du mal mit einem Debugger durch den Code gegangen?
-
Der Debugger springt in vector:
__declspec(noreturn) void _Xran() const { // report an out_of_range error _Xout_of_range("invalid vector<T> subscript"); }dann in xthrow:
_CRTIMP2_PURE __declspec(noreturn) void __CLRCALL_PURE_OR_CDECL _Xout_of_range(_In_z_ const char * _Message) { // report an out_of_range error _THROW_NCEE(out_of_range, _Message); }dann stdexcept:
explicit out_of_range(const char *_Message) : _Mybase(_Message) { // construct from message string }dann in exception:
_EXCEPTION_INLINE __CLR_OR_THIS_CALL exception::exception(const char * const & _What) : _Mywhat(NULL), _Mydofree(false) { _Copy_str(_What); }Und dann zeigt Visual Studio:
Quelldateiinformationen: Quelle für "f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp" wird gesucht. Checksum: MD5 {71 72 36 66 b4 3b 91 95 84 76 e7 9d d9 88 65 52} Die Datei "f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp" ist nicht vorhanden. "f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp" wird in Skriptdokumenten gesucht... "f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp" wird in Projekten gesucht. Die Datei wurde nicht in einem Projekt gefunden. In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\vc7\atlmfc" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\vc7\crt" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfcm" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\atl" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\\include" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfcm" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\atl" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\\include" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfcm" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\atl" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\\include" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfcm" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\atl" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\\include" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfcm" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\src\atl" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src" wird gesucht... In Verzeichnis "" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\include" wird gesucht... In Verzeichnis "C:\Program Files\Microsoft SDKs\Windows\v7.0A\\include" wird gesucht... In Verzeichnis "" wird gesucht... In den Einstellungen zum Debuggen von Quelldateien für die aktive Lösung ist angegeben, dass der Benutzer nicht zum Suchen der Datei aufgefordert wird: f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp. Die Quelldatei "f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp" wurde nicht gefunden.Der findet throw.cpp nicht oder wie...irgendwie komisch.
Was heißt eigentlich UB???
-
KeineAhnung78 schrieb:
Was heißt eigentlich UB???
Undefinied Behavior - Undefiniertes Verhalten
Wenn du zum Beispiel irgendwo über Speichergrenzen hinausschreibst, ist nicht definiert, was passieren wird.Wenn die Exception nicht gefangen wird, was steht im Output-Fenster des Debuggers? Dort sollte eigentlich stehen, was für eine Exception unterwegs war. Über die Nummer, welche als Hexadezimalzahl dargestellt ist, könnte man auch andere Fehler identifizieren, da Hardware- wie Softwareexceptions in Windows über SEH laufen.
Grüssli
-
Es kommt ein Fenster mit dem Text:
Unbehandelte Ausnahme bei 0x004a430c in moca.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd.
Da habe ich nun die Optionen "Unterbrechen" und "Weiter", wobei "Weiter" nicht funktioniert.
-
KeineAhnung78 schrieb:
[b]Unbehandelte Ausnahme bei 0x004a430c in moca.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd.
Du greifst anscheinend über einen uninitialisierten Zeiger auf etwas zu. Da hilft auch kein try/catch.
Drück mal auf Unterbrechen, dann zeigt dir der Debugger, wo das passiert.
-
Tatsache:
Ich lande in einem Destruktor:
CStatorwicklung::~CStatorwicklung() { //fwickelkopf ist Member (Zeiger auf CWickelkopf) if(fwickelkopf) delete fwickelkopf; }Das heißt, wenn fwickelkopf==NULL ist, sollte er aber auch nicht versuchen, den Zeiger zu löschen!
Da schreibe ich dämliche Destruktoren, wenn das so nicht klappt
?Update: Also das Objekt Wickelkopf ist erzeugt worden, dementsprechend ist auch der Zeiger != NULL. Wieso kann dann darauf kein delete ausgeführt werden
???
-
KeineAhnung78 schrieb:
Das heißt, wenn fwickelkopf==NULL ist, sollte er aber auch nicht versuchen, den Zeiger zu löschen!
Was nicht weiter schlimm wäre, weil delete mit Nullzeigern nichts tut. Das if ist also überflüssig.
Welchen Wert hat denn der Zeiger an dieser Stelle?
-
MFK schrieb:
KeineAhnung78 schrieb:
Das heißt, wenn fwickelkopf==NULL ist, sollte er aber auch nicht versuchen, den Zeiger zu löschen!
Was nicht weiter schlimm wäre, weil delete mit Nullzeigern nichts tut. Das if ist also überflüssig.
Oha, wieder was gelernt...
Welchen Wert hat denn der Zeiger an dieser Stelle?
fwickelkopf 0xcdcdcdcd {fspalt_wickelkopf=??? fd_innen=??? flaenge=??? }
Zu den Membern steht dort:
fspalt_wickelkopf CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden
fd_innen CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden
flaenge CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden
-
Kannst Du mal konkreten Code zeigen, wo das passiert? Hast Du den Vektor dynamisch angelegt?
-
KeineAhnung78 schrieb:
fwickelkopf 0xcdcdcdcd {fspalt_wickelkopf=??? fd_innen=??? flaenge=??? }
Dann wurde dieser Zeiger offenbar nie initialisiert, weder mit NULL noch mit einem durch new erstellten Zeiger.
Welchen Wert hat this?
-
Tachyon schrieb:
Kannst Du mal konkreten Code zeigen, wo das passiert? Hast Du den Vektor dynamisch angelegt?
Ich glaube, der Vektor ist gar nicht mehr das Problem, sondern eher die Destruktoren, die durch das "throw" aufgerufen werden. Den Vektor habe ich so angelegt, wie im ersten Posting abgebildet. Ich habe diesen Fehler zur Vereinfachung gewählt. Nehme ich meine eigene Fehlerklasse CFehler und werfe damit einen Fehler, zeigt das Programm ein identisches Verhalten.
Wann kann denn denn ein delete zum Absturz führen???
Was genau für Code soll ich am besten noch posten?
-
Vielleicht wirft der Dtor der zum fwickelkopf-Objekt gehörenden Klasse eine Exception. Zeig mal den Dtor von fwickelkopf, bitte.
-
KeineAhnung78 schrieb:
Wann kann denn denn ein delete zum Absturz führen???
Ganz einfach dadurch, dass du es mit einem Zeiger aufrufst, der nicht Null ist oder aus einem new stammt. Dsa erzeugt nämlich undefiniertes Verhalten.
-
CStatorwicklung::~CStatorwicklung() { //fwickelkopf ist Member (Zeiger auf CWickelkopf) if(fwickelkopf) delete fwickelkopf; }Was heißt das jetzt genau? fwickelkopf ist ein Mitglied von CStatorwicklung oder nur ein Zeiger auf eine CStatorwicklung? Im letzteren Fall gehört ein delete eigentlich nicht in den Destructor. In jedem Fall ist aber eine Initialisierung des Zeigers hilfreich. Gehe dazu einmal alle deine Konstruktoren durch.
-
Dann wurde dieser Zeiger offenbar nie initialisiert, weder mit NULL noch mit einem durch new erstellten Zeiger.
Jungs, dat is et!
Im Standard-Konstruktor von CStatorwicklung steht zwar "new CWickelkopf()", aber es wird ein andere Konstruktor von CStatorwicklung aufgerufen, der nur in der Headerdatei definiert wurde. Schnell rüber damit in die cpp :D. Dort fehlte natürlich ein "new CWickelkopf()".
Danke für die schnelle Hilfe. Ich werde jetzt speziell noch weiter nach dieser Art von Fehler suchen und hoffen, dass dann alle Exceptions richtig erkannt werden!!!
-
KeineAhnung78 schrieb:
Dort fehlte natürlich ein "new CWickelkopf()".
Das heißt, du machst in CTor new, und im DTor delete?
Warum nicht einfach ein CWickelkopf-Member? So wenig Zeiger wie möglich.
-
MFK schrieb:
KeineAhnung78 schrieb:
Dort fehlte natürlich ein "new CWickelkopf()".
Das heißt, du machst in CTor new, und im DTor delete?
Warum nicht einfach ein CWickelkopf-Member? So wenig Zeiger wie möglich.
fwickelkopf ist ein Member, aber eben ein Zeiger. Du meinst, CWickelkopf sollte Member sein und nicht CWickelkopf* ???
Es klappt immer noch nicht

Jetzt kann zwar delete ausgeführt werden, weil das Objekt existiert, aber aus dem Destruktor von CWickelkopf
CWickelkopf::~CWickelkopf() { cout << "Destruktor Wickelkopf" << endl; }komme ich nicht wieder raus. Mit beenden dieser Funktion crasht auch das Programm.
Himmel, seit Jahre programmiere ich mit dieser Struktur und nun hab ich doch irgendwo nen ganz schönen Mist drinnen...
-
KeineAhnung78 schrieb:
fwickelkopf ist ein Member, aber eben ein Zeiger. Du meinst, CWickelkopf sollte Member sein und nicht CWickelkopf* ???
Genau.
KeineAhnung78 schrieb:
Mit beenden dieser Funktion crasht auch das Programm.
Geht's etwas genauer als "es crasht"?
-
MFK schrieb:
KeineAhnung78 schrieb:
Mit beenden dieser Funktion crasht auch das Programm.
Geht's etwas genauer als "es crasht"?
Äh ja :).
Ich hangele mich langsam mit F11 durch den Code und nachdem die Destruktoren der Basisklassen durch sind, kommt ein Visusl Studio Tab mit dem Text:
Aufruflistenort:
moca.exe!CWickelkopf::'scalar deleting destructor'() + 0x2b Bytes