En C, pour gérer des erreurs, nous n’avions d’autre choix que de renvoyer quelque chose de spécial. Un 1-1, un NULL, des valeurs qu’il fallait vérifier et qui se font très souvent ignorer au risque d’un SEGV.

En C++ quand on a une erreur on va utiliser throw. C’est un mot clé qui interrompt la fonction en cours et toute les autres jusqu’à ce qu’il y en a une qui réceptionne la donné qui a été throw.

Pour réceptionner une donnée throw il faut utiliser try et catch. Si quelque chose throw dans le bloc try alors on a une chance de l’attraper dans le catch, seulement si le type de ce qui a été throw est compatible avec celui que l’on a écrit dans le catch.

int failing_function(void)
{
	throw 12;
}

int main(void)
{
	try {
		failing_function();
		std::cout << "Hello from after the func\n";
	} catch (int a) {
		std::cerr << "caught " << a << "\n";
	}
}

Techniquement, on peut throw n’importe quoi. Mais en pratique on utilise des classes d’erreurs. La bibliothèque standard throw des objets qui héritent de std::exception. Ils peuvent être catch comme ceci :

try {
	// [...]
} catch (std::exception &err) {
	std::cerr << "got an error " << err.what() << "\n"; 
}