C++
VeröffentlichtRevision 1

Fehler mit throw, try und catch behandeln

Eine Exception, deutsch Ausnahme, meldet einen Fehler über mehrere Funktionsaufrufe hinweg. throw löst sie aus. Ein try-Block bezeichnet den überwachten Bereich; catch behandelt einen passenden Ausnahmetyp.

Fehler mit throw, try und catch behandeln#

Dateien, Fehler und Werkzeuge · Lektion 50 von 60

Voraussetzungen: Funktionen, RAII. Lernziel: Du unterscheidest erwartbare fehlende Ergebnisse von Ausnahmen.

Eine Exception, deutsch Ausnahme, meldet einen Fehler über mehrere Funktionsaufrufe hinweg. throw löst sie aus. Ein try-Block bezeichnet den überwachten Bereich; catch behandelt einen passenden Ausnahmetyp.

C++
1#include <iostream>2#include <stdexcept>3 4double teilen(double zaehler, double nenner) {5    if (nenner == 0.0) {6        throw std::invalid_argument{"Nenner darf nicht null sein"};7    }8    return zaehler / nenner;9}10 11int main() {12    try {13        std::cout << teilen(5.0, 0.0) << '\n';14    } catch (const std::exception& fehler) {15        std::cerr << "Fehler: " << fehler.what() << '\n';16        return 1;17    }18}

std::invalid_argument aus <stdexcept> beschreibt ein ungeeignetes Argument. std::exception ist eine gemeinsame Basis vieler Standardausnahmen. what() liefert eine Beschreibung. Das Fangen als konstante Referenz vermeidet unnötige Kopien und den Verlust abgeleiteter Information.

Stack Unwinding#

Beim Suchen einer passenden Behandlung werden verlassene Aufrufe abgebaut. Das heißt Stack Unwinding. Dabei werden bereits vollständig erzeugte lokale Objekte der verlassenen Bereiche zerstört. RAII gibt deren Ressourcen frei. Rohzeiger allein führen kein solches Aufräumen ihrer Ziele durch.

Eine nicht behandelte Ausnahme führt zur Programmbeendigung. catch (...) fängt beliebige Ausnahmen, sagt aber nichts über ihren Inhalt. Verwende es nicht zum stillen Verschlucken aller Fehler. Ohne echte Wiederherstellung kann das Programm danach in einem fachlich falschen Zustand fortfahren.

Garantien und noexcept#

Ausnahmesicherheit beschreibt den Zustand nach einer fehlgeschlagenen Operation. Die Basisgarantie hält gültige Zustände und verhindert Ressourcenlecks. Die starke Garantie lässt die beobachtbare Operation bei Fehlschlag wie nicht ausgeführt erscheinen. Eine „keine Ausnahme“-Garantie verspricht eine passende nichtwerfende Operation.

noexcept kennzeichnet eine entsprechende Zusage auf Sprachebene. Entkommt trotzdem eine Ausnahme aus einer solchen Funktion, wird std::terminate aufgerufen. Schreibe noexcept daher nicht nur, um Warnungen oder Überlegungen zu vermeiden. Destruktoren sollten keine Fehler durch entkommende Ausnahmen melden.

Fehlerform passend wählen#

Für gewöhnlich fehlende Suchergebnisse passt optional. Für detaillierte erwartbare Fehlgründe kann ein eigener Ergebnistyp passen; C++23 bietet außerdem std::expected. Ausnahmen sind eine andere vereinbarte Schnittstellenstrategie. Halte innerhalb eines Projekts Regeln konsistent und dokumentiere sie.

Übung#

Fängt ein gewöhnliches catch zuverlässig jeden ungültigen Zeigerzugriff ab?

Lösung

Nein. Undefiniertes Verhalten ist keine normale C++-Exception-Schnittstelle. Verhindere den ungültigen Zugriff und nutze Diagnosewerkzeuge, statt try/catch als Speicherprüfung zu behandeln.

Weiterlernen#

Zurück: Textdateien lesen und schreiben · Kursübersicht · Weiter: Debugger, Warnungen und Sanitizer

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.