C++: lancer des exceptions, utiliser ' new ' ou non?

Est-il correct d'utiliser throw new FoobarException(Baz argument); ou throw FoobarException(Baz argument);?

Lors de la capture, j'utilise toujours catch(FoobarException& e) "juste au cas où" mais je n'ai jamais pu trouver une réponse solide si je devais utiliser new ou non en C++ (Java définitivement) ou si c'était juste une préférence du programmeur.

26
demandé sur Casey 2011-07-23 20:38:54

2 réponses

Les Exceptions en C++ doivent être levées par valeur et interceptées par référence.

Donc c'est la bonne façon:

try
{
    throw FoobarException(argument);
}
catch( const FoobarException &ex )
{
    cout << ex.what() << endl;
}

Ne lancez pas une exception créée avec new, CAR qui est responsable de sa suppression n'est pas bien défini. En outre, l'exécution d'allocations pendant la gestion des erreurs peut déclencher une autre exception, obscurcissant le problème d'origine.

Vous n'avez pas à attraper par référence const (non-const fonctionnera bien), mais j'aime le faire de toute façon. Vous devriez cependant toujours par référence (pas par valeur) pour attraper l'exception polymorphiquement. Si vous ne le faites pas, le type de l'exception peut être découpé en tranches.

33
répondu Sven 2011-07-23 17:00:43

À moins qu'il n'y ait une exigence spéciale de ne pas le faire, je lance toujours par valeur et attrape par const référence. C'est parce que le new lui-même pourrait également lancer une exception, pendant la gestion des erreurs, il est préférable d'éviter les choses qui peuvent provoquer des exceptions.

7
répondu Evan Teran 2011-07-23 16:43:13