Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1290 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°706124
fungus
Posté le 22-04-2004 à 16:14:23  profilanswer
 

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

mood
Publicité
Posté le 22-04-2004 à 16:14:23  profilanswer
 

n°706142
SoWhatIn22
Posté le 22-04-2004 à 16:26:12  profilanswer
 

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.
 
 

n°706243
Taz
bisounours-codeur
Posté le 22-04-2004 à 17:23:04  profilanswer
 

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

n°706309
fungus
Posté le 22-04-2004 à 18:08:52  profilanswer
 

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

n°706318
Taz
bisounours-codeur
Posté le 22-04-2004 à 18:14:23  profilanswer
 

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

n°706339
SoWhatIn22
Posté le 22-04-2004 à 18:36:29  profilanswer
 

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?

n°706350
Taz
bisounours-codeur
Posté le 22-04-2004 à 18:43:36  profilanswer
 

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

n°706367
Ace17
Posté le 22-04-2004 à 19:16:15  profilanswer
 

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

n°706376
Taz
bisounours-codeur
Posté le 22-04-2004 à 19:38:48  profilanswer
 

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 ?

n°706577
Ace17
Posté le 22-04-2004 à 23:49:05  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Récupérer un nom de base pour la détruire (Shell) ?recuperer la premiere ligne d'un tableau
recupérer la variable d'un radio[VB] Connection HTTP pour récupérer un fichier binaire
Recuperer le texte d'une page web dans un fichier texte[Batch] Récupérer la 1iere ligne d'un fichier log
[C]recupérer des caractères dans une chaineRecuperer une page externe
Comment récupérer le nom d'utilisateur d'un poste 
Plus de sujets relatifs à : catch (...): peut-on récupérer l'exception?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR