C++ Exceptions erkennen

ocsme

Top Contributor
Guten Tag zusammen,

hab mal einen Blick in C++ in das Exception Handling geworfen und verstehe gerade nur noch Bahnhof.
Also ich kenne von Java das ganze ja so. Schreibt man eine eigene Klasse (Bibliothek) erkennt man von "außen", wenn man die Klasse selbst nicht geschrieben hat, anhand des throws im Methodenkopf welche Exception geworfen werden kann.

Nun hab ich mir das ganze in C++ angeschaut und verstehe es nicht.
Wenn ich eine Exception auslöse in einer Methode:

C++:
double division(int a, int b) {
   if( b == 0 ) {
      throw "Division by zero condition!";
   }
   return (a/b);
}

wie soll man nun wenn man eine Bibliothek mit Exceptions includiert erkennen welche Exceptions geworfen werden?
Natürlich könnte man das ganze dann in try { ... } catch(...) {} packen. Doch das ist doch ähnlich wie finally in Java. Wie soll man dann ein Wunder-Rezept schreiben um sämtliche Exceptions abzufangen und darauf zu reagieren. Mir fällt dort dann nur so etwas ein wie std::exit(); das man das Programm beendet.

Irgendwie kommt mir das Exceptions Handling in C++ sehr mysteriös vor. Gibt es jemand der etwas Klarheit hier rein bringen kann?
 

Thallius

Top Contributor
Der Punkt ist, dass man in C++ Exceptions wirklich nur dann benutzt wenn es Exceptions sind. Eine Exception bedeutet, dass ein weiteres Ausführen des Programmes keine valide Funktion mehr bedeuten würde und von daher wird das Programm beendet.
In deinem Fall müßte der aufrufende Teil halt vorher prüfen ob der divisor nicht 0 ist. tut er das nicht schmiert die software ab und er sieht sofort warum und muss dann eben seinen Teil des Codes verbessern.

Exception zur Fehlerbehandlung zu verwenden ist leider heutzutage Gang und Gebe geworden, weil man sich damit halt viele Sicherheitsabfragen sparen kann.
 

mrBrown

Super-Moderator
Mitarbeiter
Exception zur Fehlerbehandlung zu verwenden ist leider heutzutage Gang und Gebe geworden, weil man sich damit halt viele Sicherheitsabfragen sparen kann.
Ich glaube, aus dir spricht da ein ziemliches Unwissen über Exceptions in Java, zB über den semantischen Unterschied zwischen Error, Exception und RuntimeException. Die meisten Exceptions lassen sich nicht durch "Sicherheitsabfragen" ersetzen, da entweder gar keine Abfrage möglich ist, oder die Exception einen Verstoß anzeigen soll. An den wenigsten Stellen ist es ein "entweder, oder", sondern eher ein "und", und an vielen anderen Stellen sind generell nur Exceptions möglich.

Was viel schlimmer ist, dass es immer noch so verbreitet ist, Angst vor Exceptions zu haben und stattdessen return-Codes o.ä. für Fehlern zu nutzen...
 

httpdigest

Top Contributor
Was viel schlimmer ist, dass es immer noch so verbreitet ist, Angst vor Exceptions zu haben und stattdessen return-Codes o.ä. für Fehlern zu nutzen...
Siehe Go (Golang). :)
Habe neulich einen Microservice in Go/Golang entwickelt, und muss aber sagen, dass es einigermassen "erfrischend" ist, nicht auf (unbekannte) Exceptions bei jedem Funktionsaufruf reagieren zu müssen, sondern: Wenn eine Funktion einen (bekannten) Fehler (und kein Panic) generieren kann, dann hat sie einen Error-Returnvalue, den man behandeln muss, oder an den Aufrufer mit einem eigenen Error-Returnvalue zurückgibt.
EDIT: Ja, ich kenne den unterschied zwischen unchecked und checked Java Exceptions. :)
 
Zuletzt bearbeitet:

ocsme

Top Contributor
mhhh...
Das beantwortet alles aber leider nicht meine Frage =D
Meine Frage war ja wie erkenne ich in C++ ob eine Exception von einer "fremden" Methode geworfen wird oder nicht.

Alles andere ist auch höchst Interessant doch löst gerade nicht mein eigentliches Problem in meinem Kopf =D (hehe)
Könnte man darauf nochmal kurz eingehen? Wäre super LIEB =)

Ich kenne das eben nur aus Java und dort würde man dann oben bei der Methode

C++:
double division(int a, int b) {

das ganze so schreiben:
Java:
double division(int a, int b) throws exception {
 

mrBrown

Super-Moderator
Mitarbeiter
Meine Frage war ja wie erkenne ich in C++ ob eine Exception von einer "fremden" Methode geworfen wird oder nicht.
In die Doku gucken und hoffen, dass alle Fehler, die du behandeln kannst, dort stehen :) Also wie in Java bei RuntimeExceptions.

Behandeln kannst du die mit try-catch, alle sinnvollen Exception sollten von std::exception abgeleitet sein, du brauchst also auch nur diese (bzw konkrete Sub-Typen davon) fangen, und nicht einfach alles, auch wenn es theoretisch möglich wäre.


EDIT:
Wie soll man dann ein Wunder-Rezept schreiben um sämtliche Exceptions abzufangen und darauf zu reagieren. Mir fällt dort dann nur so etwas ein wie std::exit(); das man das Programm beendet.
Wie man drauf reagiert, hängt ganz von der konkreten Situation ab, genau wie auch in Java.

Entweder kannst du sinnvoll mit der Exception zur Laufzeit umgehen, dann machst du das, oder du beendest das Programm (bzw schmeißt eine Exception weiter).
 

ocsme

Top Contributor
In die Doku gucken und hoffen, dass alle Fehler, die du behandeln kannst, dort stehen :) Also wie in Java bei RuntimeExceptions.
Vielen Dank :)

Wenn Ihr möchtet dürft Ihr sehr gerne weiter Diskutieren :)
Ich glaube es lässt sich auch nicht so pauschal sagen wann und wo eine Exception geworfen muss. Es gibt Situationen dort ist es unabdingbar doch es gibt eben auch Situationen dort kann man (siehe Methode oben) entweder so oder so darauf reagieren :)

Oder ist das falsch?
 

mrBrown

Super-Moderator
Mitarbeiter
Ich glaube es lässt sich auch nicht so pauschal sagen wann und wo eine Exception geworfen muss. Es gibt Situationen dort ist es unabdingbar doch es gibt eben auch Situationen dort kann man (siehe Methode oben) entweder so oder so darauf reagieren :)
Mit "Methode oben" meinst du diese:
C++:
double division(int a, int b) {
   if( b == 0 ) {
      throw "Division by zero condition!";
   }
   return (a/b);
}

Welches wäre denn eine andere Möglichkeit, darauf zu reagieren (abgesehen von NaN, was da durch double möglich ist, der impliziten Exception und einer sinnvollen Exception statt dem String)?
 

ocsme

Top Contributor
Naja man hätte doch auch wie oben gesagt wurde -1 als Fehlercode zurück geben können =D
Dann hat man aber direkt das Problem wenn man es in der main (oder sonst wo) nicht abfängt es eben auch knallt =D

Ich werfe bei so etwas eh gleich eine Exception weil es einfach ein Bedienungsfehler ist ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Zulässige Konstanden in C erkennen Andere Programmiersprachen 1

Ähnliche Java Themen

Neue Themen


Oben