C++ Exception Handling: Praktische Try, Catch, Throw Voorbeelden
Wat is Exception Handling in C++?
Exception handling laat C++‑programma's op een nette manier herstellen van onverwachte runtime‑fouten. Wanneer een fout optreedt, springt de controle naar een specifieke handler die kan beslissen hoe te reageren.
Door potentieel problematische code in een try-blok te plaatsen en dit te volgen met een of meer catch-clauses, geef je het programma een duidelijk pad om uitzonderlijke condities te beheren.
Als geen exception gegooid wordt, draait het try-blok normaal en worden de handlers overgeslagen.
In deze tutorial leer je:
- Wat exception handling is en waarom het belangrijk is
- De kern‑keywords:
throw,catch,try - Syntaxis en veelvoorkomende patronen
- Standaardexceptions gedefinieerd door de C++ Standard Library
- Hoe je user‑defined exceptions creëert en gebruikt
Waarom Exception Handling?
Exception handling biedt diverse concrete voordelen:
- Scheidt foutafhandelingslogica van reguliere code, wat leesbaarheid en onderhoudbaarheid verbetert.
- Stelt functies in staat om alleen de exceptions te exposen waar ze om geven; callers kunnen de rest afhandelen.
Belangrijkste Exception Handling Keywords
Drie keywords vormen de ruggengraat van C++ exception handling:
- throw – signaleert een foutconditie door een exception‑object aan te maken.
- catch – vangt een exception op en biedt code om erop te reageren.
- try – markeert het coderegio dat exceptions kan gooien.
Code binnen het try-blok heet beschermde code; als het gooit, wordt de bijbehorende catch-blok uitgevoerd.
Syntaxis
try { // beschermde code } catch (Exception_Name exception1) { // handle exception1 } catch (Exception_Name exception2) { // handle exception2 } // ... meer catch‑blokken
- Een enkel
trykan gevolgd worden door meerderecatch-clauses. - Het type in elke
catch-clause specificeert de op te vangen exception. - Binnen een
catchkan de gevangen exception worden gerefereerd door de gekozen identificator.
Voorbeeld 1: Vector‑Element Buiten Bereik Benaderen
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vec;
vec.push_back(0);
vec.push_back(1);
try {
vec.at(2); // out of range
} catch (exception& ex) {
cout << "Exception occurred!" << endl;
}
return 0;
}
Output:

Hier is een screenshot van de code:

Code‑analyse:
- Include
iostreamenvectorvoor I/O en container‑ondersteuning. - Gebruik de
std-naamruimte om volledig‑gekwalificeerde namen te vermijden. - Instantieer een
vector<int>en vul het. - Probeer een element buiten de grenzen van de vector te benaderen binnen een
try-blok. - Vang de standaard
std::exceptionen geef een bericht weer. - Return vanuit
main.
Voorbeeld 2: Delen door Nul Afhandelen
#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {
if (y == 0) {
throw "Division by Zero!";
}
return static_cast(x) / y;
}
int main() {
int a = 11;
int b = 0;
double c = 0;
try {
c = zeroDivision(a, b);
cout << c << endl;
} catch (const char* message) {
cerr << message << endl;
}
return 0;
}
Output:

Hier is een screenshot van de code:

Code‑analyse:
- Definieer
zeroDivisiondie een C‑string gooit bij deling door nul. - Roep de functie aan binnen een
try-blok en print het resultaat. - Vang de string‑exception op en geef een foutmelding weer.
C++ Standaardexceptions

De Standard Library declareert een rijke hiërarchie van exceptions in <exception>. Hieronder de meest gebruikte:
| Exception | Beschrijving |
|---|---|
| std::exception | Basisklasse voor alle standardexceptions. |
| std::bad_alloc | Gegooid door new bij allocatiefout. |
| std::bad_cast | Gegooid door dynamic_cast wanneer een cast faalt. |
| std::bad_exception | Gebruikt om een onverwachte exception te signaleren. |
| std::bad_typeid | Gegooid door typeid op een glvalue van een polymorfe type dat null is. |
| std::logic_error | Fouten die door de programmeur detecteerbaar zouden moeten zijn. |
| std::domain_error | Ongeldig domein voor een wiskundige functie. |
| std::invalid_argument | Functie ontving een ongeldig argument. |
| std::length_error | Poging een string te creëren die te groot is. |
| std::out_of_range | Gegooid door vector::at als index out of bounds is. |
| std::runtime_error | Runtime‑fouten niet gevangen door andere categorieën. |
| std::overflow_error | Wiskundige overflow opgetreden. |
| std::range_error | Waarde buiten bereik voor de operatie. |
| std::underflow_error | Wiskundige underflow opgetreden. |
User‑Defined Exceptions
De std::exception-basisklasse kan uitgebreid worden om domein‑specifieke fouttypen te creëren. Het overschrijven van what() levert een beschrijvend bericht.
Voorbeeld: Custom Exception
#include <iostream>
#include <exception>
using namespace std;
class NewException : public exception {
public:
const char* what() const noexcept override {
return "newException occurred";
}
} newex;
int main() {
try {
throw newex;
} catch (exception& ex) {
cout << ex.what() << '\n';
}
return 0;
}
Output:

Hier is een screenshot van de code:

Code‑analyse:
- Afleiden van
NewExceptionvanstd::exceptionenwhat()overschrijven. - Instantieer een object
newexom te gooien. - Gooien
newexbinnen eentry-blok. - Vangen per referentie naar
std::exceptionen print het bericht viawhat().
Kernpunten
- Exception handling is essentieel voor robuuste C++‑applicaties die van runtime‑fouten moeten herstellen.
- Gebruik
tryom code te beschermen,catchom te reageren, enthrowom problemen te signaleren. - Profiteer van de rijke set standardexceptions, en breid
std::exceptionuit wanneer custom fouttypen nodig zijn. - Houd foutafhandelingslogica gescheiden van business‑logica voor schonere, onderhoudbare code.
C Taal
- C++ comments: best practices voor leesbare, onderhoudbare code
- C++ Operators Uitgelegd: Typen, Voorbeelden en Voorbeeldprogramma's
- C++ Switch‑Case Onder de Knie: Syntaxis, Gebruik en Praktische Voorbeelden
- C++ Dynamische Array‑Allocatie: Praktische Handleiding met Code‑Voorbeelden
- C++ Structs Uitgelegd met een Praktisch Voorbeeld
- Beheersen van std::list in C++: Syntaxis, Functies & Praktische Voorbeelden
- C++ Struct vs Class: Belangrijkste Verschillen, Syntaxis en Beste Gebruikssituaties
- 15 Beste C++ IDE's voor Windows, macOS & Linux – Gratis & Betaalde Opties (2021)
- Python-exception handling: try, except, else en finally uitgelegd
- Java Exception Handling meesteren: Try, Catch, Finally, Throw & Throws uitgelegd
- Java Exception Handling meesteren: Try, Catch, Finally en Resources