[teilweise gelöst] Auffangen von Ausnahmen
-
Hallo Leute,
jetzt wende ich mich wieder mit einem kleinen Problem an Euch. Beim Ablauf meines Testprogramms wird eine erzwungene Ausnahme nicht aufgefangen.
int main(int argc, char** args) { console::Surface screen(make_pair(79, 20)); screen.fill('o'); display(screen); try { screen.put(make_pair(1000, 1000), 'E'); } catch(console::OutOfBounds& e) { cerr << e.getMessage() << endl; } catch(...) { cerr << "Unkown error! Blame the programmer!" << endl; } return 0; }In Zeile 8 wird die Ausnahme 'console::OutOfBounds' durch die Übergabe eines "zu großen" Parameterpaares erzwungen. Keine der beiden catch-Blöcke wird aufgerufen. Das Ende des Programms wird nicht erreicht (getestet via Einfügen einer Ausgabe).
Nachfolgend der Ausschnitt aus dem Quelltext, welcher die Ausnahme werfen sollte:
void put(Coord_t coord, char c) throw(OutOfBounds); // puts a character at the given location.void Surface::put(Coord_t coord, char c) throw(OutOfBounds) { // Check boundaries, throw exception if out of bounds if(coord.first >= size.first || coord.second >= size.second) { throw(OutOfBounds("put:Coordinate out of bounds!")); } // Put new char to the requested location surface_data[coord.second * size.first + coord.first] = c; }Die Bedingungen der if-Anweisung sind erfüllt (getestet via Einfügen einer Ausgabe).
Meine Frage an Euch: Wieso greift keiner der beiden catch-Blöcke auf die erzwungene Ausnahme?
Falls von Bedeutung: Entwicklungsumgebung ist DevCpp (4.9.9.2) unter WindowsXP Prof.
Grüße aus dem S(ch)auerland...
Heiko
-
Was macht denn das Programm stattdessen, wenn es die Exception nicht auffängt?
(und hast du mal im Debugger verfolgt, was eigenstlich passiert?)
-
1. Sind Exceptions in den Compile-Options aktiviert? Manche ältere Compiler haben die ausgeschaltet.
2. throw(bla) in Zeile 5 des letzten Codebsp. Ehm, geht das überhaupt mit den zwei Klammern?
-
Artchi schrieb:
2. throw(bla) in Zeile 5 des letzten Codebsp. Ehm, geht das überhaupt mit den zwei Klammern?
Wieso sollte es nicht gehen - sind doch auch zwei geöffnete Klammern (eine für den Ctor-Aufruf, die zweite schließt den kompletten throw-Ausdruck ein).
-
CStoll schrieb:
Was macht denn das Programm stattdessen, wenn es die Exception nicht auffängt?
(und hast du mal im Debugger verfolgt, was eigenstlich passiert?)
Faktisch "tut sich nichts". Das Programm bricht ohne Meldung ab.
EDIT: Die display-Funktion verrichtet noch wie erwartet ihren Dienst.
Durch den Debugger hab ich das Programm noch nicht jagen können. Das Teil scheint hier etwas rumzuzicken. Ich werde das ganze aber nachher noch einmal auf einem Linux-System (mit halbwegs aktuellen Paketen) probieren.
Artchi schrieb:
1. Sind Exceptions in den Compile-Options aktiviert? Manche ältere Compiler haben die ausgeschaltet.
2. throw(bla) in Zeile 5 des letzten Codebsp. Ehm, geht das überhaupt mit den zwei Klammern?1. Zumindest kann ich gerade nichts finden, was dieses explizit abschaltet und da
2. sich der Compiler sich bei meinem Programm nicht beschwert hatte, gehe ich mal schwer davon aus, dass sowohl 1 und 2 nicht das Thema sind. Des weiteren schreibt mein Buch (und so ziemlich alles andere auch), dass Exceptions ganz normale Klassen sind, warum sollte das also mit "zwei Klammern" nicht funktionieren. Ich rufe lediglich einen anderen als den Default-Konstruktor auf.
--
Schade, ich dachte, ich hätte lediglich was ganz triviales übersehen. Bisher traf ich noch nicht auf Probleme, welche sich nicht mit einem gewaltigen Schlag vor den Kopf hätten erklären lassen.

-
bwbg schrieb:
EDIT: Die display-Funktion verrichtet noch wie erwartet ihren Dienst.
Das heißt, sie schreibt das E irgendwo außerhalb des verfügbaren Fensters in den Speicher? Das deutet doch sehr darauf hin, daß die Exception ignoriert wurde.
-
Mit diesem EDIT wollte ich nur verdeutlichen, dass bis zum try-catch-Block alles nach Plan verläuft und lediglich die Angelegenheit mit den Ausnahmen (welche ich durch das Schreiben "außerhalb des Verfügbaren Fensters" testen wollte) nicht so funktioniert, wie ich das erwarte.
void console::Surface::put wirft die Ausnahme (bzw. sollte das tun), die Bedingung für die Ausnahme ist in dem Falle auch erfüllt. Ab dem throw (Zeile 5 im 3. Code-Abschnitt) verlässt mich mein Latein (und mein Programm .. wahrscheinlich).
-
Ich habe das Programm jetzt hier auf meiner Linux-Dose übersetzt und beim Ausführen verhält es sich so, wie ich es erwartet habe:
Die Ausnahme wird geworfen, und der entsprechende Hinweistext wird ausgegeben.
Somit handelt es sich um ein "lokales" Problem.
Danke für die Mühe...
Heiko