KooR.fr - throw - Le langage C++ ANSI/ISO
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Instruction throw

Syntaxe d'utilisation

throw exception
returnType functionName( type var, ... ) throw (exceptionType, ...);

En fait le mot clé throw peut être utilisé pour deux besoins distincts. La première utilisation permet le déclenchement d'une exception (d'une erreur). La seconde utilisation permet de définir qu'une fonction peut potentiellement déclencher une exception. Dans les deux cas, il vous est fortement conseillé d'utiliser des classes comme types d'exceptions. De plus, les standards ANSI et ISO attendent à ce que vous dériviez vos classes d'exceptions à partir de la classe std::exception (définie dans l'entête C++ <exception>).

Si vous indiquez sur une signature de fonction (ou de méthode) qu'elle est potentiellement apte à déclencher une (ou plusieurs) exception(s), alors sachez que si une exception d'un type non déclaré dans la liste d'exceptions potentielles est déclenchée, alors un crash immédiat et irrécupérable de votre processus interviendra. Si vous définissez cette liste d'exceptions potentiellement déclenchables, il vous faudra en aucun cas avoir oublié un type d'exceptions. Pour cette raison, cette possibilité est souvent ignorée : cela est fort dommageable, car la lisibilité de ces codes en est impactée.

Exemple de code

#include <cstdlib>
#include <ctime>

#include <iostream>
#include <stdexcept>

using namespace std;

/* Imagine a library that can throw an exception. */
double fct() throw( domain_error ) {
    int value = rand() % 3;
    if ( value == 0 ) throw domain_error( "0 is a Bad value" );
    return 1.0 / value;
}

/* Here an usage of this library */
int main() {

    srand( time( NULL ) );

    try {
        cout << "Result == " << fct() << endl;
    } catch( const exception & e ) {
        cerr << e.what() << endl;
    }
    
    return 0;
}

Sujets connexes