Nous avons une bibliothèque qui traite de nombreux aspects du signalement des erreurs. J'ai été chargé de porter cette bibliothèque sur Linux. Lors de l'exécution de ma petite suite de tests, l'un des tests a échoué. Une version simplifiée du test apparaît ci-dessous.Lancement d'une exception depuis un gestionnaire de signal
// Compiler: 4.1.1 20070105 RedHat 4.1.1-52
// Output: Terminate called after throwing an instance of 'int' abort
#include <iostream>
#include <csignal>
using namespace std;
void catch_signal(int signalNumber)
{
signal(SIGINT, SIG_DFL);
throw(signalNumber);
}
int test_signal()
{
signal(SIGINT, catch_signal);
try
{
raise(SIGINT);
}
catch (int &z)
{
cerr << "Caught exception: " << z << endl;
}
return 0;
}
int main()
{
try
{
test_signal();
}
catch (int &z)
{
cerr << "Caught unexpected exception: " << z << endl;
}
return 0;
}
Mon attente est que le Caught exception: le message sera affiché. Qu'est-ce qui se passe réellement, c'est que le programme se termine car aucun gestionnaire de catch semble être présent pour l'int lancé.
Il y a quelques questions sur les SO qui semblent liées. J'ai trouvé un certain nombre de pages Google liées. La «sagesse» semble se résumer à.
- Ya ne peut pas lancer des exceptions de gestionnaires de signaux, provoque le gestionnaire signal de fonctionne avec sa propre pile, donc il n'y a pas gestionnaires définis sur elle.
- Ya peut jeter des exceptions à partir des gestionnaires de signaux, il suffit de reconstruire un faux cadre sur la pile, et vous êtes prêt à partir.
- Ya, on le fait tout le temps. Cela fonctionne pour moi sur la plate-forme X
Ya, qui était disponible avec gcc, mais ne semble pas fonctionner plus. Essayez l'option -fnon-call-exceptions, peut-être que cela fonctionnera
Le code fonctionne comme prévu sur nos compilateurs/environnements AIX/TRU64/MSVC. Il échoue dans notre environnement Linux.
Je cherche des suggestions pour aider à résoudre ce problème afin que le comportement bibliothèque Linux correspondra à mes autres plates-formes, ou une sorte ou solution de contournement qui pourrait atteindre le même type de fonctionnalité.
La suppression du signal de vidage du programme sur le noyau n'est pas une option viable.
[Cet article] (http://www.ibm.com/developerworks/library/l-cppexcep/) prétend que cela fonctionne; il mentionne un correctif peut être nécessaire que cela ne semble pas expliquer cependant. –