OVH Cloud OVH Cloud

Exception multiples

114 réponses
Avatar
bernard tatin
J'ai un problème d'exceptions multiples qui, je pense, est bien décrit
par le code suivant :

// une exception
class Excp {
public:
Excp(char *msg) : message (msg) {}
virtual ~Excp() {}
inline string& getMessage () {
return message;
}
protected:
string message;
};

// une classe simple
class B {
public:
B(int j) : k(j) {}
inline void run () {
throw Excp("exception imprévue dans le run");
}
virtual ~B () { throw Excp("Bad B"); }
private:
int k;
};

void test_excp () {
try {
try {
B b(-5);
b.run();
std::cout << "Création de B ... et sortie" << std::endl;
}
catch (Excp &e) {
std::cout << "Exception " << e.getMessage() << std::endl;
}
}
catch (Excp &e) {
std::cout << "Exception " << e.getMessage() << std::endl;
}
catch (...) {
std::cout << "Exception inconnue" << std::endl;
}
}

int main () {
test_excp ();
return 0;
}

Je comprend que l'exception déclenchée dans b.run() provoque la sortie
du bloc et donc la destruction de l'objet b. Une nouvelle exception est
alors levée. Je pensais que mes try/catch résolverais le problème, mais
ce n'est pas le cas. J'ai un message
Executable “tests” has exited due to signal 6 (SIGABRT).
Et rien d'autre. C'est un vrai plantage. Si je supprime l'un des deux
throw, j'ai le résultat attendu.

J'utilise gcc 3.3 sur MacOS 10.3.5.

Est-ce que quelqu'un a des explications ? Je sais comment m'en dépétrer,
ce qui m'intéresse c'est le pourquoi du comment.

Merci.

Bernard.

10 réponses

Avatar
Fabien LE LEZ
On 27 Oct 2004 23:52:12 -0500, Gabriel Dos Reis :

Je regrette que le dernier XC++ soit encore aussi anti-export. :-(


Jusque-là, je ne m'étais pas du tout intéressé à export -- de toutes
façons, aucun des compilos que je serais tenté d'utiliser en
production ne l'implémente.
Aussi, quand j'ai vu ce chapitre, je me suis dit "Tiens, bonne
occasion pour essayer de comprendre à quoi ça sert." Raté. Par contre,
j'ai compris pourquoi aucun éditeur ne l'implémente.

D'après toi, export aurait une réelle utilité ?


--
;-)

Avatar
Gabriel Dos Reis
Fabien LE LEZ writes:

| On 27 Oct 2004 23:52:12 -0500, Gabriel Dos Reis :
|
| >Je regrette que le dernier XC++ soit encore aussi anti-export. :-(
|
| Jusque-là, je ne m'étais pas du tout intéressé à export -- de toutes
| façons, aucun des compilos que je serais tenté d'utiliser en
| production ne l'implémente.

Tu veux dire que tu ne serais jamais tenté par utiliser des compilos
basés sur le front-end EDG en production ?
Ils ont un très bon front-end, avec des diagnostics très bien travaillés.

| Aussi, quand j'ai vu ce chapitre, je me suis dit "Tiens, bonne
| occasion pour essayer de comprendre à quoi ça sert." Raté.

D'auters lecteurs ont d'autres perceptions que la mienne. Mais après
avoir lu et relu plusieurs fois ce chapitre, je n'ai pas l'impression
qu'il avait pour but d'expliquer à quoi il sert. C'est dommage.

| Par contre,
| j'ai compris pourquoi aucun éditeur ne l'implémente.

Ah non !?!? Pourrais-tu m'expliquer ?

Et l'implémentation de EDG, elle n'existe pas, c'est ça ?


| D'après toi, export aurait une réelle utilité ?

Pour ce qu'il est censé faire, oui. Tu voudras peut-être lire l'article
de Jean-Marc dans Overload.

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Fabien LE LEZ writes:

| On Wed, 27 Oct 2004 18:27:15 +0200, drkm :
|
| > Unfortunately, I do not know of any good and safe use for
| > std::uncaught_exception. My advice: Don't use it.
|
| En lisant Herb Sutter, on s'aperçoit qu'un sacré paquet de
| fonctionnalités de C++ sont inutiles[*] ;-)
|
| [*] à commencer par "export", même s'il est moins catégorique sur cet
| exemple.

Je regrette que le dernier XC++ soit encore aussi anti-export. :-(


Je ne l'ai pas lu. Mais bon, si on n'utilise pas le bon
mécanisme d'instantiation, export n'a que des avantages de
"propreté" et c'est vrai que dans ces conditions on peut
douter de son intérêt.

<mode=Parthe>
C'est quoi le mécanisme d'instantiation utilisé par Microsoft?
</mode=Parthe>

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

D'après toi, export aurait une réelle utilité ?


D'après moi, oui. Outre la propreté, il y a un gain certain
en vitesse pour les templates instanciés dans plusieurs
unités de compilation pour les compilateurs utilisant une
méthode itérée d'instantiation.

Dans mon article pour Overload il y a des chiffres sur un
exemple artificiel. Pour le batir
A partir de scratch: 10.2s sans entête précompilé
5.2s avec
3.7s avec export
Après une modification du type: 9.4s, 4.7s et 2.5s
Après une modification du template: 9.3s, 4.7s et 2s
(J'avais pas fait de mesure en combinant les entêtes
précompilés et export à cause d'un bug de como).

Depuis j'ai aussi fait des mesures sur un exemple plus
réaliste (cet exemple se voulait représentatif d'un cas réel
oùpour éviter les dépendances j'avais décidé d'utiliser de
l'héritage plutôt que des templates). On avait un gain avec
export pour une recompilation après une modification du
template dés qu'il y avait 2 unités contenant la même
instantiation. Je ne me souviens pas à partir de combien
d'unité de compilation avec la même instantiation il y avait
des gains pour le build de scratch et celui après une
modification d'un type paramètre template.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Pour ce qu'il est censé faire, oui. Tu voudras peut-être lire l'article
de Jean-Marc dans Overload.


Je vais essayer de voir si je peux le mettre sur mon site.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Arnaud Meurgues
Jean-Marc Bourguet wrote:

<mode=Parthe>
C'est quoi le mécanisme d'instantiation utilisé par Microsoft?
</mode=Parthe>


Quels sont les différents mécanismes d'instanciation possible ?

--
Arnaud
(Supprimez les geneurs pour me répondre)

Avatar
Jean-Marc Bourguet
Arnaud Meurgues writes:

Jean-Marc Bourguet wrote:

<mode=Parthe>
C'est quoi le mécanisme d'instantiation utilisé par Microsoft?
</mode=Parthe>


Quels sont les différents mécanismes d'instanciation possible ?


Les 3 mécanismes utilisés sont:
- greedy: on instancie dans toutes les unités puis le
linker jette. export ne lui apporte évidemment
rien en ce qui concerne le temps de compilation
- queried: les instances sont stockées à un endroit donné,
quand on a besoin d'une, si elle n'y est pas on
la génère. export lui évite de parser tout ce
qui est nécessaire à la définition si on n'a
pas besoin de générer une instantiation. La
gestion automatique des dépendances est
vraissemblablement compliquée.
- iterated: un prelinker assigne les instantiations
manquantes à une unité de compilation capable de
la fournir. export lui évite de parser tout ce
qui est nécessaire à la définition si on n'a
pas besoin de générer une instantiation. La
gestion automatique des dépendances est
exactement la même que s'il n'y avait pas export.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Fabien LE LEZ
On 28 Oct 2004 04:57:05 -0500, Gabriel Dos Reis :

Tu veux dire que tu ne serais jamais tenté par utiliser des compilos
basés sur le front-end EDG en production ?


Pas dans l'immédiat, en tout cas.
Surtout après avoir lu les réponses à
<news:.
Il est possible qu'à moyen terme je l'utilise, comme il est possible
que d'autres compilos finissent par l'implémenter.

Quoi qu'il en soit, dans l'immédiat "export" reste pour moi un sujet
théorique, d'autant que je travaille sur des petits projets (quelques
dizaines de milliers de lignes de code), qui sont compilables très
vite (moins de deux minutes sur mon PC pour une recompilation
complète) et ne nécessitent donc pas de méthodes spécifiques
d'accélération de la compilation.


D'auters lecteurs ont d'autres perceptions que la mienne. Mais après
avoir lu et relu plusieurs fois ce chapitre, je n'ai pas l'impression
qu'il avait pour but d'expliquer à quoi il sert.


Effectivement.

C'est dommage.


C'est peut-être pas le but, d'autant que ses lecteurs sont sensés déjà
connaître les bases -- et donc avoir une bonne idée de ce qu'est
"export".

Et l'implémentation de EDG, elle n'existe pas, c'est ça ?


Bon, OK, j'ai oublié le "presque". L'idée est que implémenter "export"
dans Comeau semble avoir été un travail titanesque, et que tout le
monde ne semble pas d'accord sur l'utilité d'"export", donc la
rentabilité d'un tel travail.

Note : comme indiqué plus haut, je n'ai pas la moindre expérience de
projets qui demandent un énorme temps de compilation.



--
;-)

Avatar
Matthieu Moy
Fabien LE LEZ writes:

Pas dans l'immédiat, en tout cas.
Surtout après avoir lu les réponses à
<news:.
Il est possible qu'à moyen terme je l'utilise, comme il est possible
que d'autres compilos finissent par l'implémenter.


Sauf erreur de ma part, le compilateur Intel utilise aussi EDG.

--
Matthieu

Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

Bon, OK, j'ai oublié le "presque". L'idée est que
implémenter "export" dans Comeau semble avoir été un
travail titanesque,


2 petites sociétés (4 personnes en tout) ont réussit à le
faire en quoi? 4 ans? et à ne pas crouler -- donc c'est pas
du temps plein. Je ne qualifierais pas ça de titanesque.
J'ai vu des plus gros investissements -- plus gros que 16
homme-ans je veux dire -- être envoyés à la trappe parce
qu'on a racheté une autre société. Bon, on n'est pas aussi
petit qu'EDG et Comeau, mais en capitalisation boursière on
ne fait qu'un pourcent de Microsoft.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org