Non, ce que je veux dire, c'est qu'un code proche de
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class LaClasseQuRisqueDeFoirer{
public:
LaClasseQuRisqueDeFoirer(A* ptr){
/* Je fais d'abord tout ce qui peut lancer une exception */
/* puis, seulement, je donnes ptr à mon unique_ptr */
uptr.reset(ptr);
}
private:
std::unique_ptr<A> uptr;
};
void foo(){
/* on se fout d'ou il vient, mais ptr pointe bel et bien sur un objet correct */
try{
LaClasseQuRisqueDeFoirer obj(ptr);
}catch(...){
/* oups... la classe a foiré, par chance, j'ai toujours mon pointeur.
* Que puis-je faire d'autre avant d'abandonner ?
*/
}
} |
sera quand même beaucoup plus cohérent qu'un code proche de
Ce qui compte, c'est que dans le premier cas, tu peux récupérer le pointeur en sachant qu'il est toujours valide et donc envisager une "autre solution" (quelle qu'elle soit :sauvegarder les données en catastrophe par exemple, avant de laisser planter l'application) .
Alors que, dans le second cas, on se doute bien que tu voulais sans doute te débarrasser de la responsabilité de ptr, mais ce n'est pas forcément pour cela que tu voulais qu'il soit détruit si vite!
Et la seule solution qu'il te restera pour récupérer un pointeur vers un objet strictement équivalent sera de recréer l'objet et de rejouer "toute la scène" qui a fait qu'il se trouvait dans son état bien particulier... Si tant est que ce soit possible (et ca l'est rarement).
Autrement dit, si il y a effectivement "quelque chose qui foire", tu as peut être tout intérêt à laisser l'application planter car ce sera toujours mieux que d'avoir des données incohérentes, mais tu n'a,
a priori, aucun moyen de "rattraper le coup"
. Et il peut y avoir des tonnes de raisons pour que ce soit une soluton inacceptable!
Partager