C++ try-catch funktioniert nur bedingt

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
643
Hallo,

try/catch verhält sich etwas komisch. Mit Codeblocks kompiliert. Bei debug immer Absturz ohne Ausgabe. Bei release wird catch nicht ausgegeben wenn der Fehler eine Division durch 0 ist. Nur per throw klappt es beim release. Wieso klappt es beim debug gar nicht und beim release nur per throw?

Gruß

Code:
try
{
   double a = 1/0;
}
catch(...)
{
   std::cout << "Problem erkannt \n";
}
std::cout << "danach";

Bei Debug -> Absturz.
Bei Release -> wird try/catch einfach übersprungen OHNE in catch den Text "Problem erkannt" auszugeben.

Code:
try
{
   throw 0;
}
catch(...)
{
   std::cout << "Problem erkannt \n";
}
std::cout << "danach";

Bei Debug -> Absturz.
Bei Release -> funktioniert. Text "Problem erkannt" wird ausgegeben.
 
C++ hat soweit ich weiß keine Exception bei Division durch 0. Ist auch eine schlechte Lösung was du da machst, wenn du mich fragst.
Du wirst ja wohl niemals absichtlich durch 0 teilen. Also musst du halt deine Variable die in manchen Fällen 0 sein kann einfach gegenprüfen und entsprechend darauf reagieren.

Also: Mit Programmierlogik vorgehen und solche Fälle gar nicht entstehen lassen als mit try/catch versuchen hinterher den Mist wieder auszubügeln wenn das Kind in den Brunnen gefallen ist.

Ganz einfache Lösung, damit dein Beispiel funktioniert:
Code:
if (variable == 0)
        throw std::overflow_error("Teilung durch 0");
 
Zuletzt bearbeitet:
Hier habe ich das Beispiel mit der Division gesehen http://www.willemer.de/informatik/cpp/exceptions.htm daher dachte ich eine Null-Division kann gefangen werden. Ich dachte per catch(...) werden alle Ausnahmen gefangen schade eigentlich wenn es in C++ nicht gehen würde. Die Prüfung auf == 0 habe ich bisher sogar so gemacht, wollte nur etwas größere Codebereiche auf einmal einfangen.
 
tja, da kennt sich eben jemand mit der Materie nicht wirklich aus und nimmt ein Standardbeispiel her ohne konkret die Programmiersprache technisch voll zu verstehen ;)

catch fängt nur alle C++ Exceptions ab, aber keine die beispielsweise von der CPU oder von Windows oder sonst was geworfen werden (wie hier der division durch 0 Fehler).
Dies ist in C++ Standard nicht vorgesehen und du musst selbst eine Exception werfen bzw. anderweitig drauf reagieren.

Im Grunde gehts aber bei dem Beispiel bloß darum, dass man nicht durch 0 teilen darf. Für eine Exception in C++ ist das natürlich ein denkbar schlechtes Beispiel und damit ein Eigentor :D
 
Zuletzt bearbeitet:
Gut zu wissen, dann ist man ja gezwungen dafür zu sorgen, dass es auf keinen Fall passieren kann und hat damit evt. sehr viele if-Abfragen. Aber wenn es so sein muss dann werde ich weiterhin mit der if Abfrage den Divisor vorher auf Null prüfen sofern das Auftreten von Null denkbar wäre, damit kann man leben :)
 
Das ist glaub ich auch die Intention des von dir verlinkten Tutorials.
Also, dass du kapierst, dass du solche Sachen abfangen musst und immer damit rechnen musst, dass sowas passiert wenn du eine Variable bekommst und durch diese teilst.
Die Lösung muss ja auch keine geworfene Exception sein. Je nach Programm kann man damit ja auch anders in der if Abfrage umgehen und den Programmablauf dadurch nicht in die catch-Clause umleiten.
 
rg88 schrieb:
Das ist glaub ich auch die Intention des von dir verlinkten Tutorials.
Also, dass du kapierst, dass du solche Sachen abfangen musst und immer damit rechnen musst, dass sowas passiert wenn du eine Variable bekommst und durch diese teilst.

Im Tutorial steht aber explizit, dass das mit try-catch geht:

Die Division durch 0 im Beispiel würde normalerweise zu einem Programmabsturz führen. [...] Tritt eine solche Ausnahme in einem try-Block auf, dann wird die Verarbeitung in dem behandelnden catch-Block fortgesetzt.

Warum das beim TE nicht geht, kann ich leider nicht kommentieren.
Prinzipiell gilt jedoch immer: bei solchen Sachen stets auf Nummer sicher gehen und die "Nullnummer" entsprechend extra prüfen ;)
 
HardRockDude schrieb:
Im Tutorial steht aber explizit, dass das mit try-catch geht:
Und die Fußnote dazu:
Bei vielen Versionen des GNU-Compilers (auf jeden Fall bei gcc-2.9.2 und bei gcc-2.95.3, vermutlich auch bei neueren) werden die Divisionen durch 0 und die Fließkomma-Ausnahmen nicht vom generellen catch(...) abgefangen.
 
Laut C++ Standard ist integer division (und modulo) mit 0 undefined behavior. Siehe hier: Catching exception: divide by zero
Also auf keinen Fall jemals machen, weil das jeder Compiler anders handhaben kann (und offensichtlich auch tut).

Gruß
BlackMark
 
Darlis schrieb:
Und die Fußnote dazu:
Krass, das hab ich glatt übersehen. Der Autor der Webpage sollte vielleicht erwägen, diese nicht ganz unkritische / unwesentliche Info aus der Fußnote in den Fließtext zu übernehmen...
 
Zurück
Oben