À QUOI ÇA SERT ?
Une exception permet de séparer :
- le code normal ;
- le traitement d’une erreur exceptionnelle.
Code: Select all
int result = open();
if (result != 0)
{
return result;
}
Code: Select all
if (failed)
{
throw Error{};
}
1. throw
Code: Select all
throw std::runtime_error{"Erreur"};
Le runtime cherche un catch compatible.
2. try / catch
Code: Select all
try
{
riskyFunction();
}
catch (const std::exception& ex)
{
std::cerr << ex.what();
}
3. STACK UNWINDING
C’est le point essentiel.
Supposons :
Code: Select all
void f()
{
Resource r;
riskyFunction();
}
Avant de quitter f(), le destructeur de r est appelé.
C’est pourquoi RAII fonctionne parfaitement avec les exceptions.
4. POURQUOI catch PAR const&
Code: Select all
catch (const std::exception& ex)
Pour :
- éviter une copie ;
- conserver le polymorphisme ;
- lire l’exception sans la modifier.
5. EXCEPTIONS ET BAS NIVEAU
Dans certains environnements :
- kernel ;
- firmware ;
- temps réel ;
- projets sans runtime complet ;
Sous Windows kernel, on rencontre davantage :
- NTSTATUS ;
- SEH selon contexte ;
- codes d’erreur.
- errno ;
- codes de retour.
À RETENIR
Exception :
mécanisme de transfert de contrôle en cas d’erreur.
RAII :
garantit que les ressources automatiques sont libérées pendant la remontée.
