 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Benoit Guest
|
Posted: Wed Sep 07, 2005 10:25 am Post subject: Remplacement d'exeption dans une librairie statique sur Sola |
|
|
Bonjour
Voici le problème auquel je suis confronté. J'ai amélioré une
librairie existante dans mon projet, en remplaçant une fonction en C
par une fonction plus rapide en C++.
J'ai profité de ce remplacement pour utiliser des exceptions dans le
code C++ pour gérer les cas d'erreurs. J'ai fait des tests avec cette
librairie et tout fonctionne pour le mieux. Surtout dans les cas
d'erreurs où mes exceptions sont correctement "catchées" par le code
de récupération d'erreur. Tout irait pour le mieux dans le meilleur
des mondes si je ne devais pas intégrer ces librairies modifiées dans
un projet plus gros, utilisant COOL:Gen.
En effet, alors que tout se passe pour le mieux dans mon petit projet,
lorsque j'intégre ces librairies dans le projet COOL:Gen, la gestion
des exceptions codées par moi est remplacé par la gestion par
défaut, qui est terminate(), puis abort et core dump !
POur illustrer ce que j'ai, voici un exemple de code :
main ()
{
try
{
CBinMAnager aBinManager ;
CBin abin = aBinManager.find (parameter1, paramater2) ; // C'est
la nelle
//
fonction
aBin.DisplayContent () ;
}
catch (CMyExceptionClass& e)
{
std::cout << e.what() << std::endl ;
}
}
Dans mon environnement, en cas d'erreur, j'ai bien le message d'erreur
normale et le programme sort normalement. Parfait !
Par contre, lorsque j'intégre la librairie dans le projet principal,
et que je construit les binaires via COOL:Gen, j'ai un terminate(),
avec abort() et core dump.
Comme si mon code avait été transformé en :
main ()
{
CBinMAnager aBinManager ;
CBin abin = aBinManager.find (parameter1, paramater2) ;
aBin.DisplayContent () ;
}
Quelqu'un a-t-il eu un problème équivalent ?
D'avance merci de votre aide/remarques/réfléxtions
Cordialement
Benoit
|
|
| Back to top |
|
 |
Benoit Guest
|
Posted: Wed Sep 07, 2005 10:28 am Post subject: Re: Remplacement d'exeption dans une librairie statique sur |
|
|
Euh, j'ai un peu oublié quelques informations techniques.
Je travaille sur Solaris 2.8, compilation avec le C++ de forte 6.2
patch 2.
Les autres langagues sont aussi ceux de forte 6.2 patch 2.
Enfin, nous utllisons Oracle 8, 64 bits, et COOL:Gen 6.5.
Merci d'avance de votre aide
Cordialement
Benoit
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Thu Sep 08, 2005 8:02 am Post subject: Re: Remplacement d'exeption dans une librairie statique sur |
|
|
Benoit wrote:
| Quote: | Voici le problème auquel je suis confronté. J'ai amélioré une
librairie existante dans mon projet, en remplaçant une
fonction en C par une fonction plus rapide en C++.
J'ai profité de ce remplacement pour utiliser des exceptions
dans le code C++ pour gérer les cas d'erreurs. J'ai fait des
tests avec cette librairie et tout fonctionne pour le mieux.
Surtout dans les cas d'erreurs où mes exceptions sont
correctement "catchées" par le code de récupération d'erreur.
Tout irait pour le mieux dans le meilleur des mondes si je ne
devais pas intégrer ces librairies modifiées dans un projet
plus gros, utilisant COOL:Gen.
En effet, alors que tout se passe pour le mieux dans mon petit
projet, lorsque j'intégre ces librairies dans le projet
COOL:Gen, la gestion des exceptions codées par moi est
remplacé par la gestion par défaut, qui est terminate(), puis
abort et core dump !
POur illustrer ce que j'ai, voici un exemple de code :
main ()
{
try
{
CBinMAnager aBinManager ;
CBin abin = aBinManager.find (parameter1, paramater2) ; // C'est la nelle
// fonction
aBin.DisplayContent () ;
}
catch (CMyExceptionClass& e)
{
std::cout << e.what() << std::endl ;
}
}
Dans mon environnement, en cas d'erreur, j'ai bien le message
d'erreur normale et le programme sort normalement. Parfait !
Par contre, lorsque j'intégre la librairie dans le projet
principal, et que je construit les binaires via COOL:Gen, j'ai
un terminate(), avec abort() et core dump.
|
La résponse évidante, c'est qu'il n'y a pas de catch autour du
throw. Sans savoir ce que fait COOL:Gen, c'est difficile à dire
pourquoi. Qui appelle CBinManater::find, et où? (Pour que le
catch soit effectif, il faut qu'il soit dans une fonction qui
appelle la fonction qui lève l'exception. Et dans le même
thread, évidement.)
| Quote: | Comme si mon code avait été transformé en :
main ()
{
CBinMAnager aBinManager ;
CBin abin = aBinManager.find (parameter1, paramater2) ;
aBin.DisplayContent () ;
}
Quelqu'un a-t-il eu un problème équivalent ?
D'avance merci de votre aide/remarques/réfléxtions
|
Je vois deux possibilités immédiates : que l'appel de la
fonction qui lève l'exception a lieu dans un autre thread, ou
qu'il a lieu dans un call-back qui travers du code C, voire des
appels système. (Je ne sais pas si ce seconde serait réelement
un problème avec les outils Sun, mais c'est une possibilité.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|