catch (...): peut-on récupérer l'exception?

catch (...): peut-on récupérer l'exception? - C++ - Programmation

Marsh Posté le 22-04-2004 à 16:14:23    

Bonjour,
 
Je porte des sources en C et C++ de Netscape NSAPI vers Apache sur AIX 4.3 en utilisant gcc 2.95.3 comme compilateur.
 
Le module Apache que je génère est lié avec un .so compilé lui aussi avec gcc.
 
Dans le module, j'éxécute une fonction (admettons maFonction) déclarée dans mon source C (utilisé pour générer le module) de cette manière:
 
extern "C" int maFonction(char *arg1, char*arg2);
 
Cette fonction est codée dans un .cpp (utilisé pour générer le .so lié au module) de cette manière:
 
extern "C" int maFonction(char *arg1, char*arg2)
{
   try
   {
      system("echo 1>>/tmp/result.log" );
      MyObject myobject;
      system("echo 2>>/tmp/result.log" );
      ...
   }
   catch (exception &e)
   {
      system("echo 6>>/tmp/result.log" );
      ...
   }
   catch (...)
   {
      system("echo 9>>/tmp/result.log" );
      ...
   }
}
 
Le code C++ de MyObject est situé dans le même .cpp que cette fonction.
Avec gcc, je génère mon .so, puis je génère mon module. Ensuite, je charge le module dans Apache, et j'envoie une requête http.
 
En consultant le fichier de traces /tmp/result.log, j'obtiens ceci:
1
9
 
Mon but est d'intercepter l'exception générée par mon constructeur et de l'afficher pour m'aider à comprendre d'où vient le problème.
Je voudrais savoir si il est possible de récupérer un message d'exception à partir d'un bloc "catch (...)", et si oui comment?
Sinon, existe-t-il une classe d'exception mère (comme Throwable en java) qui me permettrait de récupérer le message avec appel à la fonction membre what() en C++?
Peut-être quelqu'un pourrait-il m'indiquer si j'ai fait une erreur grossière qui empêche mon module de fonctionner.
 
Merci d'avance,
fungus

Reply

Marsh Posté le 22-04-2004 à 16:14:23   

Reply

Marsh Posté le 22-04-2004 à 16:26:12    

1. catch(...) => tu ne peux pas connaitre l'exception en question.
 
2. un code bien fait fait dériver ses exceptions de std::exception, qui dispose bien d'une méthode what(). Mais ce n'est malheureusement pas toujours le cas.
 
 

Reply

Marsh Posté le 22-04-2004 à 17:23:04    

extern "C" int maFonction(char *arg1, char*arg2)
{
   try{
 
 
tu comprends ce que tu écris ou pas ?

Reply

Marsh Posté le 22-04-2004 à 18:08:52    

Désolé, petite erreur:
Dans le .c du module, la fonction n'est pas définie comme:
extern "C" int maFonction(char *arg1, char*arg2);  
mais comme:
extern int maFonction(char *arg1, char*arg2);  
 
Donc, il n'est pas possible de récupérer l'exception dans un bloc "catch (...)".
Le seul moyen de la récupérer est-il de connaître la nature de l'exception?
 
Merci

Reply

Marsh Posté le 22-04-2004 à 18:14:23    

le extern il sert à rien
 
toutes exceptions devraient dérivée de std:exception, si tu attrapes autre chose, c'est que y a vraiment une merde : ou dans le code, ou pendant l'execution

Reply

Marsh Posté le 22-04-2004 à 18:36:29    

Taz a écrit :

le extern il sert à rien


 
parfois on peut se servir de ce genre de manip quand la fonction doit faire partie d'une bibliothèque partagée que l'on voudra charger explicitement par la suite. C'est la seule façon de ne pas avoir un symbole exporté "décoré". Sympa quand on ne veut pas dépendre la version du compilo utilisé (enfin pour les compilo avec des ABI non compatibles).
 
Par contre, mettre du code C++ dans une fonction déclarée "extern C", je ne sais pas si c'est très "propre", mais il me semble que cela fonctionne pas trop mal. C'est peut être la raison.
 
J'ai dit une bêtise?

Reply

Marsh Posté le 22-04-2004 à 18:43:36    

j'ai pas dit que ça servait à rien, j'ai dit que ça servait pas à grand chose avec la définition, mais sur la declaration, là ça fait toutes ces conneries de linkage à la con

Reply

Marsh Posté le 22-04-2004 à 19:16:15    

SoWhatIn22 a écrit :


Par contre, mettre du code C++ dans une fonction déclarée "extern C", je ne sais pas si c'est très "propre"


Pourquoi ca ne le serait pas? Ca veut pas dire que ta fonction est en C! Ca veut dire qu'un programme en C pourra y accéder

Reply

Marsh Posté le 22-04-2004 à 19:38:48    

Ace17 a écrit :

Pourquoi ca ne le serait pas? Ca veut pas dire que ta fonction est en C! Ca veut dire qu'un programme en C pourra y accéder

et faire quoi avec ? attraper des exceptions, réaliser les appels virtuels, appelés les destructeurs, fournir des RTTI ?

Reply

Marsh Posté le 22-04-2004 à 23:49:05    

Ben non évidemment... Ce que je voulais dire c'était que le nom ne serait pas décoré...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed