Was macht throw in c++?

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das Schlüsselwort throw gibt an, dass ein Ausnahmefall / Fehler aufgetreten ist, der an dieser Stelle nicht behandelt werden kann / soll. In deinem Fall darf wohl etwas nicht passieren, wenn ein Stack leer ist. Dazu wird ein Objekt geworfen, welches mehr Informationen über diesen Fall angeben soll.

Einmal ein anderes Beispiel:

if (divisor == 0) {
  throw std::exception("Division by zero is not allowed");
}

float quotient = dividend / divisor;

Üblicherweise wird ein Exception-Objekt geworfen, welches mehrere Informationen über den Fehler aufnehmen kann. Zum Beispiel die Code-Stelle, an der der Fehler auftrat sowie eine Fehlernachricht.

Lies Weiteres zu Exception Handling bspw. hier und hier.

In deinem Fall wird nur ein C-type String geworfen. Eine, meiner Ansicht nach, eher schlechte Praktik. Alle relevanten Informationen müssten schließlich nun in den String hineingepresst werden.


regex9  19.06.2020, 01:43

Ergänzung:

Mit throw bricht auch die Ausführung des aktuellen Code-Blocks ab und der Programmfluss springt wieder zum aufrufenden Kontext zurück (vergleichbar mit return). Der Programmfluss springt aber noch weiter, wenn das geworfene Objekt nicht aufgefangen wird.

Mit try-catch kann ein geworfenes Objekt wieder aufgefangen werden. Es ist in diesem Zuge möglich, den Ausnahmefall zu handhaben, indem man bspw. eine Fehlermeldung für die Nutzeroberfläche ausgibt oder auf alternative Lösungswege ausweicht (im obigen Fall könnte man das Ergebnis auch einfach als 0 definieren, wenn man das möchte - das Verhalten des Programms muss man eben selbst bestimmen). Wird die Ausnahme nicht behandelt, kann sie zum Abbruch des Programms führen.

Ausgeweitet auf das obige Beispiel:

float getQuotient(float dividend, float divisor)
{
  if (divisor == 0) {
    throw std::exception("Division by zero is not allowed"); // MSVC specific
  }
  
  return dividend / divisor;
}

int main()
{
  try {
    float quotient = getQuotient(5, 0);
    std::cout << quotient;
  }
  catch (const std::exception &ex) {
    std::cout << ex.what();
  }

  return 0;
}
1

Das erzeugt eine Ausnahme.

Das bricht den aktuellen Ablauf des Programms ab und spring durch alle Funktionsaufrufe nach oben zurück, bis es irgendwo gefangen wird (Catch).

Wird es nirgends gefangen beendet sich das Programm mit einem Ausnahmefehler.

Das dient dazu Situationen zu behandeln, mit der an der aktuellen Programmstelle nicht klargekommen werden kann.


MrAmazing2  19.06.2020, 01:21

Wie kannst du so gut deutsch, ich tu mich voll schwer das so schön zu formulieren :((

Hast du Tipps?

0

Das gehört zur Fehlerbehandlung in C++ und vielen anderen objektorientierten Programmiersprachen. Mit throw (engl. werfen) signalisierst du, dass ein Fehler aufgetreten ist. In deinem Beispiel wird einfach ein String "geworfen", der eine mehr oder weniger zutreffende Beschreibung des aufgetretenen Fehlers beinhaltet. Typischerweise wirst du aber eher eine sorgfältig entworfene Ausnahme (engl. Exception) melden wollen, die bereits ihrem Klassennamen nach signalisiert, was schiefgelaufen ist. Du kannst auch eigene Exception Classes erstellen, indem deine Klasse das Interface std::exception implementiert. Dies verlangt von dir, dass du die what() Methode der Klasse bereitstellst, welche wiederum eine genauere Beschreibung des Fehlers enthält. Exceptions abfangen kannst du in einem try/catch Block. Aber alles, was ich hier schreibe, solltest du eher in der online Referenz deiner Wahl oder in einem Handbuch zu C++ nachlesen. Das sind absolute OOP Basics.

Per throw meldet ein C++ Programm, dass etwas nicht mehr stimmt und es daher keinen Sinn mehr macht, weiterzurechnen.

Entsprechende Meldungen nennt man Exceptions.

Der Programmierfehler, der zu einer Exception führt, kann aber schon viel früher im Programmablauf passiert sein.

Lies noch viel mehr dazu hier: https://isocpp.org/wiki/faq/exceptions

Es unterbricht die Funktion an der Stelle und gibt einen Fehler zurück. Wird dieser Fehler nicht in einer Übergeordneten Funktion gecatcht (=abgefangen) bricht das ganze Programm ab.

Woher ich das weiß:Studium / Ausbildung – Bachelor in Informatik 👨🏻‍🎓