Réponse acceptée !
Ce n'est pas vraiment possible. Si le programme plante, il plante !
Tu ne peux pas vraiment gérer ça. En effet, l'utilisateur qu'il voit: "segfault" ou "Un problème technique est survenue, merci de contacter etc...", il ne pourra pas faire grand chose.
Lorsque ce type d'erreur survient, on demande généralement au client de:
- Décrire ce qu'ils ont fait, pour reproduire le problème.
- Récupérer le core dump, qui contient la stack trace des derniers événement avant erreur.
Je comprends ton besoin, mais avec ta technique, tu vas inutilement complexifier le code. C'est beaucoup trop intrusif. Si c'est vraiment ce que tu veux, dans ce cas, fait toi une classe "SandBox" qui entoure chacun des classes, et en cas d'erreur affiche une erreur contenant le nom de la classe en cause (pas top, et encore trop intrusif à mon goût).
Une deuxième technique, utilisé notamment en java, est de créer un logger. Tu logges tout ce que tu peux, et en cas d'erreur, tu met simplement un "try{}catch(...){}" dans ton "main()", et tu propose à l'utilisateur d'envoyer le dit rapport.
PS:
Un autre moyen d'attraper un "segfault", est de se lier a ce signal:
Code C/C++ :
#include <iostream>
#include <csignal>
#include <cstdlib>
void onError(int)
{
// Prevent infinite recursion if onError() causes another segfault
std::signal(SIGSEGV, SIG_DFL);
std::cout << "Segfault spotted !" << std::endl;
std::abort();
}
int main ()
{
std::signal(SIGSEGV, onError);
int *p = 0;
*p = 0; // Segfault
return 0;
}
Il n'y a de toute façon pas de solution miracle :)