Manuel Zaccaria wrote on 22/07/2006 23:35:
Des spécifications d'exception comme en java ? J'espère bien que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la compil.,
l'article ne parle que de vérification au runtime.
ma question portait sur un contrôle à la compilation.
Manuel Zaccaria wrote on 22/07/2006 23:35:
Des spécifications d'exception comme en java ? J'espère bien que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la compil.,
l'article ne parle que de vérification au runtime.
ma question portait sur un contrôle à la compilation.
Manuel Zaccaria wrote on 22/07/2006 23:35:
Des spécifications d'exception comme en java ? J'espère bien que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la compil.,
l'article ne parle que de vérification au runtime.
ma question portait sur un contrôle à la compilation.
Manuel Zaccaria wrote on 22/07/2006 23:35:
Des spécifications d'exception comme en java ? J'espère bien
que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la
compil.,
Manuel Zaccaria wrote on 22/07/2006 23:35:
Des spécifications d'exception comme en java ? J'espère bien
que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la
compil.,
Manuel Zaccaria wrote on 22/07/2006 23:35:
Des spécifications d'exception comme en java ? J'espère bien
que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la
compil.,
Sylvain a écrit:
Des spécifications d'exception comme en java ? J'espère bien
que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la
compil., l'article ne parle que de vérification au runtime.
ma question portait sur un contrôle à la compilation.
Si je me souviens bien, le fait de mettre des specifications
d'exception _force_ le compilateur a insérer des vérifications
au runtime (ce qui conduit à un abort() inconditionel si on
les viole).
Sylvain a écrit:
Des spécifications d'exception comme en java ? J'espère bien
que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la
compil., l'article ne parle que de vérification au runtime.
ma question portait sur un contrôle à la compilation.
Si je me souviens bien, le fait de mettre des specifications
d'exception _force_ le compilateur a insérer des vérifications
au runtime (ce qui conduit à un abort() inconditionel si on
les viole).
Sylvain a écrit:
Des spécifications d'exception comme en java ? J'espère bien
que non.
Herb Sutter résume bien bien la situation :
les 2 points sont liés ? Java fait une vérification à la
compil., l'article ne parle que de vérification au runtime.
ma question portait sur un contrôle à la compilation.
Si je me souviens bien, le fait de mettre des specifications
d'exception _force_ le compilateur a insérer des vérifications
au runtime (ce qui conduit à un abort() inconditionel si on
les viole).
Ce n'est pas tout à fait vrai. Le Java fait une vérification à
la compile pour certaines exceptions, et pas pour d'autres. Et
c'est impossible en Java d'écrire une garantie qu'une fonction
ne sortira pas par une exception, qui est la seule garantie
réelement utile. (Et ça ne me déplairait pas qu'elle soit
enforcée par le compilateur en C++, mais ça ne va pas se faire.)
Ce n'est pas tout à fait vrai. Le Java fait une vérification à
la compile pour certaines exceptions, et pas pour d'autres. Et
c'est impossible en Java d'écrire une garantie qu'une fonction
ne sortira pas par une exception, qui est la seule garantie
réelement utile. (Et ça ne me déplairait pas qu'elle soit
enforcée par le compilateur en C++, mais ça ne va pas se faire.)
Ce n'est pas tout à fait vrai. Le Java fait une vérification à
la compile pour certaines exceptions, et pas pour d'autres. Et
c'est impossible en Java d'écrire une garantie qu'une fonction
ne sortira pas par une exception, qui est la seule garantie
réelement utile. (Et ça ne me déplairait pas qu'elle soit
enforcée par le compilateur en C++, mais ça ne va pas se faire.)
ma question portait sur un contrôle à la compilation.
Pour faire ça, il faut à la compilation fournir au compilateur les
données nécessaires pour valider qu'une fonction en cours ne risque pas
d'émettre d'autres exceptions que celle qu'il a déclarées.
Fournir ces données, c'est au choix :
- faire la croix sur tout le code existant, puisque ça veut dire imposer
d'écrire les spécifications d'exception sur chaque déclaration de fonction.
- faire une croix sur la compilation séparée (et donc les biblithèques
livrées sans code source).
Je ne pense pas qu'aucun de ces choix soit acceptable en C++. D'où la
vérification au run-time.
ma question portait sur un contrôle à la compilation.
Pour faire ça, il faut à la compilation fournir au compilateur les
données nécessaires pour valider qu'une fonction en cours ne risque pas
d'émettre d'autres exceptions que celle qu'il a déclarées.
Fournir ces données, c'est au choix :
- faire la croix sur tout le code existant, puisque ça veut dire imposer
d'écrire les spécifications d'exception sur chaque déclaration de fonction.
- faire une croix sur la compilation séparée (et donc les biblithèques
livrées sans code source).
Je ne pense pas qu'aucun de ces choix soit acceptable en C++. D'où la
vérification au run-time.
ma question portait sur un contrôle à la compilation.
Pour faire ça, il faut à la compilation fournir au compilateur les
données nécessaires pour valider qu'une fonction en cours ne risque pas
d'émettre d'autres exceptions que celle qu'il a déclarées.
Fournir ces données, c'est au choix :
- faire la croix sur tout le code existant, puisque ça veut dire imposer
d'écrire les spécifications d'exception sur chaque déclaration de fonction.
- faire une croix sur la compilation séparée (et donc les biblithèques
livrées sans code source).
Je ne pense pas qu'aucun de ces choix soit acceptable en C++. D'où la
vérification au run-time.
Ce n'est pas tout à fait vrai. Le Java fait une vérification à
la compile pour certaines exceptions, et pas pour d'autres. Et
c'est impossible en Java d'écrire une garantie qu'une fonction
ne sortira pas par une exception, qui est la seule garantie
réelement utile.
(Et ça ne me déplairait pas qu'elle soit enforcée par
le compilateur en C++, mais ça ne va pas se faire.)
Ce n'est pas tout à fait vrai. Le Java fait une vérification à
la compile pour certaines exceptions, et pas pour d'autres. Et
c'est impossible en Java d'écrire une garantie qu'une fonction
ne sortira pas par une exception, qui est la seule garantie
réelement utile.
(Et ça ne me déplairait pas qu'elle soit enforcée par
le compilateur en C++, mais ça ne va pas se faire.)
Ce n'est pas tout à fait vrai. Le Java fait une vérification à
la compile pour certaines exceptions, et pas pour d'autres. Et
c'est impossible en Java d'écrire une garantie qu'une fonction
ne sortira pas par une exception, qui est la seule garantie
réelement utile.
(Et ça ne me déplairait pas qu'elle soit enforcée par
le compilateur en C++, mais ça ne va pas se faire.)
Loïc Joly wrote on 23/07/2006 00:07:
ma question portait sur un contrôle à la compilation.
Pour faire ça, il faut à la compilation fournir au compilateur les
données nécessaires pour valider qu'une fonction en cours ne risque
pas d'émettre d'autres exceptions que celle qu'il a déclarées.
sans chercher midi à 14h, pour appeler des fonctions dans une méthode on
a déjà fournit au compilo des infos sur des fct (leur proto via des
include) - si ces fct ne déclarent aucun exception (par exemple les libs
courantes) le compilo considerera qu'elles ne lèvent aucune exception
(oui cela peut être faux au runtime, mais ce n'est pas le point et il
faut faire avec l'existant);
si certaines fct listent des exception et
si d'autres sont explicitement lévées par le code de la méthode
elle-même, le compilo verifierait qu'elles sont soit catchées localement
soit déclarées dans la liste de throw.
le but serait simplement ici d'assister le codeur qui utilise une
méthode ayant publiée ses exceptions à a) le forwarder en conscience ou
b) penser à implémenter un catch local.Fournir ces données, c'est au choix :
- faire la croix sur tout le code existant, puisque ça veut dire
imposer d'écrire les spécifications d'exception sur chaque déclaration
de fonction.
imho, la fin est sans rapport avec le début.
le code existant fonctionne comme il est, pourquoi le contraire? au pire
l'appel au main est dans un try/catch pour récupérer un beau core dump.
les nouvelles méthodes qui /choississent/ de déclarer leurs exceptions
imposerait en effet à leur utilisateur et supplanteur la même 'corvée',
mais est-ce bien grave ?
le cut/paste ne marcherait plus ? ;)
- faire une croix sur la compilation séparée (et donc les biblithèques
livrées sans code source).
je ne vois pas pourquoi non plus, dans la plupart des cas "sans code
source" signifiera avec headers qui donnent les protos complets de fcts.
dans les cas liés à des architectures propriétaires, la norme est déjà
violée et/ou réécrite.Je ne pense pas qu'aucun de ces choix soit acceptable en C++. D'où la
vérification au run-time.
existe-t-elle ?
Loïc Joly wrote on 23/07/2006 00:07:
ma question portait sur un contrôle à la compilation.
Pour faire ça, il faut à la compilation fournir au compilateur les
données nécessaires pour valider qu'une fonction en cours ne risque
pas d'émettre d'autres exceptions que celle qu'il a déclarées.
sans chercher midi à 14h, pour appeler des fonctions dans une méthode on
a déjà fournit au compilo des infos sur des fct (leur proto via des
include) - si ces fct ne déclarent aucun exception (par exemple les libs
courantes) le compilo considerera qu'elles ne lèvent aucune exception
(oui cela peut être faux au runtime, mais ce n'est pas le point et il
faut faire avec l'existant);
si certaines fct listent des exception et
si d'autres sont explicitement lévées par le code de la méthode
elle-même, le compilo verifierait qu'elles sont soit catchées localement
soit déclarées dans la liste de throw.
le but serait simplement ici d'assister le codeur qui utilise une
méthode ayant publiée ses exceptions à a) le forwarder en conscience ou
b) penser à implémenter un catch local.
Fournir ces données, c'est au choix :
- faire la croix sur tout le code existant, puisque ça veut dire
imposer d'écrire les spécifications d'exception sur chaque déclaration
de fonction.
imho, la fin est sans rapport avec le début.
le code existant fonctionne comme il est, pourquoi le contraire? au pire
l'appel au main est dans un try/catch pour récupérer un beau core dump.
les nouvelles méthodes qui /choississent/ de déclarer leurs exceptions
imposerait en effet à leur utilisateur et supplanteur la même 'corvée',
mais est-ce bien grave ?
le cut/paste ne marcherait plus ? ;)
- faire une croix sur la compilation séparée (et donc les biblithèques
livrées sans code source).
je ne vois pas pourquoi non plus, dans la plupart des cas "sans code
source" signifiera avec headers qui donnent les protos complets de fcts.
dans les cas liés à des architectures propriétaires, la norme est déjà
violée et/ou réécrite.
Je ne pense pas qu'aucun de ces choix soit acceptable en C++. D'où la
vérification au run-time.
existe-t-elle ?
Loïc Joly wrote on 23/07/2006 00:07:
ma question portait sur un contrôle à la compilation.
Pour faire ça, il faut à la compilation fournir au compilateur les
données nécessaires pour valider qu'une fonction en cours ne risque
pas d'émettre d'autres exceptions que celle qu'il a déclarées.
sans chercher midi à 14h, pour appeler des fonctions dans une méthode on
a déjà fournit au compilo des infos sur des fct (leur proto via des
include) - si ces fct ne déclarent aucun exception (par exemple les libs
courantes) le compilo considerera qu'elles ne lèvent aucune exception
(oui cela peut être faux au runtime, mais ce n'est pas le point et il
faut faire avec l'existant);
si certaines fct listent des exception et
si d'autres sont explicitement lévées par le code de la méthode
elle-même, le compilo verifierait qu'elles sont soit catchées localement
soit déclarées dans la liste de throw.
le but serait simplement ici d'assister le codeur qui utilise une
méthode ayant publiée ses exceptions à a) le forwarder en conscience ou
b) penser à implémenter un catch local.Fournir ces données, c'est au choix :
- faire la croix sur tout le code existant, puisque ça veut dire
imposer d'écrire les spécifications d'exception sur chaque déclaration
de fonction.
imho, la fin est sans rapport avec le début.
le code existant fonctionne comme il est, pourquoi le contraire? au pire
l'appel au main est dans un try/catch pour récupérer un beau core dump.
les nouvelles méthodes qui /choississent/ de déclarer leurs exceptions
imposerait en effet à leur utilisateur et supplanteur la même 'corvée',
mais est-ce bien grave ?
le cut/paste ne marcherait plus ? ;)
- faire une croix sur la compilation séparée (et donc les biblithèques
livrées sans code source).
je ne vois pas pourquoi non plus, dans la plupart des cas "sans code
source" signifiera avec headers qui donnent les protos complets de fcts.
dans les cas liés à des architectures propriétaires, la norme est déjà
violée et/ou réécrite.Je ne pense pas qu'aucun de ces choix soit acceptable en C++. D'où la
vérification au run-time.
existe-t-elle ?
Loïc Joly wrote on 23/07/2006 00:07:
Proposes-tu que les fonctions avec une spécification
d'exception n'aient pas le droit d'appeler de fonction n'en
ayant pas ?
Ca pourraît être une proposition acceptable, surtout utile AMA
pour les spécifications nothrow. Il faudrait pour ça patcher
la bibliothèque standard à 2/3 endroits (je pense par exemple
à std::swap).
Et dans ce cas, il faudrait surtout que rien n'empêche une
fonction sans spécification d'appeler une fonction avec
spécification. Un peu comme const, en fait.
Là on a un système qui me semble utile et implémentable.
les nouvelles méthodes qui /choississent/ de déclarer leurs
exceptions imposerait en effet à leur utilisateur et
supplanteur la même 'corvée', mais est-ce bien grave ? le
cut/paste ne marcherait plus ? ;)
Il n'a jamais marché. Et dans le code que je fais, où souvent
les exceptions ne sont gérées qu'au niveau le plus haut pour
arrêter le programme avec un code d'erreur, j'aurais aisément
3 à 4 fois plus de lignes pour spécifier mes exceptions que
pour le corps de mes fonctions. L'intérêt des exceptions est
de séparer traitement de l'erreur de sa localisation. Si on
doit écrire des choses pour chaque fonction, je ne vois plus
l'intérêt.
En théorie, oui. Il y a eu une discussion sur
run-time/statique, il y a longtemps (89/90 d'après le § sur ce
sujet dans le D&E), et la conclusion était que bien
qu'attirante au premier abord, la vérification statique
n'était pas réalisable (et qu'elle avait finalement des effets
pervers).
En pratique, on s'est rendu compte que la vérification
dynamique n'était finalement pas hyper utile, et qu'elle avait
un coût. Et donc certains compilateurs qui ne l'implémentaient
pas vraiment ont décidé de ne pas l'implémenter du tout.
Loïc Joly wrote on 23/07/2006 00:07:
Proposes-tu que les fonctions avec une spécification
d'exception n'aient pas le droit d'appeler de fonction n'en
ayant pas ?
Ca pourraît être une proposition acceptable, surtout utile AMA
pour les spécifications nothrow. Il faudrait pour ça patcher
la bibliothèque standard à 2/3 endroits (je pense par exemple
à std::swap).
Et dans ce cas, il faudrait surtout que rien n'empêche une
fonction sans spécification d'appeler une fonction avec
spécification. Un peu comme const, en fait.
Là on a un système qui me semble utile et implémentable.
les nouvelles méthodes qui /choississent/ de déclarer leurs
exceptions imposerait en effet à leur utilisateur et
supplanteur la même 'corvée', mais est-ce bien grave ? le
cut/paste ne marcherait plus ? ;)
Il n'a jamais marché. Et dans le code que je fais, où souvent
les exceptions ne sont gérées qu'au niveau le plus haut pour
arrêter le programme avec un code d'erreur, j'aurais aisément
3 à 4 fois plus de lignes pour spécifier mes exceptions que
pour le corps de mes fonctions. L'intérêt des exceptions est
de séparer traitement de l'erreur de sa localisation. Si on
doit écrire des choses pour chaque fonction, je ne vois plus
l'intérêt.
En théorie, oui. Il y a eu une discussion sur
run-time/statique, il y a longtemps (89/90 d'après le § sur ce
sujet dans le D&E), et la conclusion était que bien
qu'attirante au premier abord, la vérification statique
n'était pas réalisable (et qu'elle avait finalement des effets
pervers).
En pratique, on s'est rendu compte que la vérification
dynamique n'était finalement pas hyper utile, et qu'elle avait
un coût. Et donc certains compilateurs qui ne l'implémentaient
pas vraiment ont décidé de ne pas l'implémenter du tout.
Loïc Joly wrote on 23/07/2006 00:07:
Proposes-tu que les fonctions avec une spécification
d'exception n'aient pas le droit d'appeler de fonction n'en
ayant pas ?
Ca pourraît être une proposition acceptable, surtout utile AMA
pour les spécifications nothrow. Il faudrait pour ça patcher
la bibliothèque standard à 2/3 endroits (je pense par exemple
à std::swap).
Et dans ce cas, il faudrait surtout que rien n'empêche une
fonction sans spécification d'appeler une fonction avec
spécification. Un peu comme const, en fait.
Là on a un système qui me semble utile et implémentable.
les nouvelles méthodes qui /choississent/ de déclarer leurs
exceptions imposerait en effet à leur utilisateur et
supplanteur la même 'corvée', mais est-ce bien grave ? le
cut/paste ne marcherait plus ? ;)
Il n'a jamais marché. Et dans le code que je fais, où souvent
les exceptions ne sont gérées qu'au niveau le plus haut pour
arrêter le programme avec un code d'erreur, j'aurais aisément
3 à 4 fois plus de lignes pour spécifier mes exceptions que
pour le corps de mes fonctions. L'intérêt des exceptions est
de séparer traitement de l'erreur de sa localisation. Si on
doit écrire des choses pour chaque fonction, je ne vois plus
l'intérêt.
En théorie, oui. Il y a eu une discussion sur
run-time/statique, il y a longtemps (89/90 d'après le § sur ce
sujet dans le D&E), et la conclusion était que bien
qu'attirante au premier abord, la vérification statique
n'était pas réalisable (et qu'elle avait finalement des effets
pervers).
En pratique, on s'est rendu compte que la vérification
dynamique n'était finalement pas hyper utile, et qu'elle avait
un coût. Et donc certains compilateurs qui ne l'implémentaient
pas vraiment ont décidé de ne pas l'implémenter du tout.
James Kanze wrote on 23/07/2006 02:13:
Ce n'est pas tout à fait vrai. Le Java fait une vérification
à la compile pour certaines exceptions, et pas pour d'autres.
Et
il oblige à catcher ou lister toutes les exceptions devant
être traitées. (la règle entre les "exceptions à gérer" et
celles qui peuvent se balader librement est un autre sujet en
soi).
c'est impossible en Java d'écrire une garantie qu'une
fonction ne sortira pas par une exception, qui est la seule
garantie réelement utile.
bien sur que si, le code suivant ne sortira *jamais* par une
exception; y compris si c'est une méthode tournant dans un
thread tué à la volée (une InterruptedException ou un
ThreadDeath sera reçu par le catch local).
returnType methodeName {
try {
// whatever
}
catch (Throwable err){
}
}
(Et ça ne me déplairait pas qu'elle soit enforcée par
le compilateur en C++, mais ça ne va pas se faire.)
ah! "ça ne va pas se faire" ... cette année, jamais ? faut
écrire son pré-pré-proc ? (10 ans que j'ai laché ça!...)
James Kanze wrote on 23/07/2006 02:13:
Ce n'est pas tout à fait vrai. Le Java fait une vérification
à la compile pour certaines exceptions, et pas pour d'autres.
Et
il oblige à catcher ou lister toutes les exceptions devant
être traitées. (la règle entre les "exceptions à gérer" et
celles qui peuvent se balader librement est un autre sujet en
soi).
c'est impossible en Java d'écrire une garantie qu'une
fonction ne sortira pas par une exception, qui est la seule
garantie réelement utile.
bien sur que si, le code suivant ne sortira *jamais* par une
exception; y compris si c'est une méthode tournant dans un
thread tué à la volée (une InterruptedException ou un
ThreadDeath sera reçu par le catch local).
returnType methodeName {
try {
// whatever
}
catch (Throwable err){
}
}
(Et ça ne me déplairait pas qu'elle soit enforcée par
le compilateur en C++, mais ça ne va pas se faire.)
ah! "ça ne va pas se faire" ... cette année, jamais ? faut
écrire son pré-pré-proc ? (10 ans que j'ai laché ça!...)
James Kanze wrote on 23/07/2006 02:13:
Ce n'est pas tout à fait vrai. Le Java fait une vérification
à la compile pour certaines exceptions, et pas pour d'autres.
Et
il oblige à catcher ou lister toutes les exceptions devant
être traitées. (la règle entre les "exceptions à gérer" et
celles qui peuvent se balader librement est un autre sujet en
soi).
c'est impossible en Java d'écrire une garantie qu'une
fonction ne sortira pas par une exception, qui est la seule
garantie réelement utile.
bien sur que si, le code suivant ne sortira *jamais* par une
exception; y compris si c'est une méthode tournant dans un
thread tué à la volée (une InterruptedException ou un
ThreadDeath sera reçu par le catch local).
returnType methodeName {
try {
// whatever
}
catch (Throwable err){
}
}
(Et ça ne me déplairait pas qu'elle soit enforcée par
le compilateur en C++, mais ça ne va pas se faire.)
ah! "ça ne va pas se faire" ... cette année, jamais ? faut
écrire son pré-pré-proc ? (10 ans que j'ai laché ça!...)
Il oblige en fait à catcher ou à lister toutes les exceptions
qui aurait dû être des codes de retour:-). Et qui le sont en
C++, en général.
returnType methodeName {
try {
// whatever
}
catch (Throwable err){
}
}
Et entre la fin du bloc de catch et le retour, il y a toujours
une possibilité d'un « VirtualMachineError ». (Un bon exemple
d'une chose qui ne doit jamais être une exception.)
Mais ce n'était pas mon propo. Je disais que tu ne pouvais
jamais écrire cette garantie. La déclaration de ta fonction
methodeName, ci-dessus, ne comporte aucune garantie en ce qui
concerne ni les Error ni les RuntimeException.
On est arrivé à un point en C++ où on peut ajouter de nouveaux
features, mais on ne peut pas toucher à l'existant.
Il oblige en fait à catcher ou à lister toutes les exceptions
qui aurait dû être des codes de retour:-). Et qui le sont en
C++, en général.
returnType methodeName {
try {
// whatever
}
catch (Throwable err){
}
}
Et entre la fin du bloc de catch et le retour, il y a toujours
une possibilité d'un « VirtualMachineError ». (Un bon exemple
d'une chose qui ne doit jamais être une exception.)
Mais ce n'était pas mon propo. Je disais que tu ne pouvais
jamais écrire cette garantie. La déclaration de ta fonction
methodeName, ci-dessus, ne comporte aucune garantie en ce qui
concerne ni les Error ni les RuntimeException.
On est arrivé à un point en C++ où on peut ajouter de nouveaux
features, mais on ne peut pas toucher à l'existant.
Il oblige en fait à catcher ou à lister toutes les exceptions
qui aurait dû être des codes de retour:-). Et qui le sont en
C++, en général.
returnType methodeName {
try {
// whatever
}
catch (Throwable err){
}
}
Et entre la fin du bloc de catch et le retour, il y a toujours
une possibilité d'un « VirtualMachineError ». (Un bon exemple
d'une chose qui ne doit jamais être une exception.)
Mais ce n'était pas mon propo. Je disais que tu ne pouvais
jamais écrire cette garantie. La déclaration de ta fonction
methodeName, ci-dessus, ne comporte aucune garantie en ce qui
concerne ni les Error ni les RuntimeException.
On est arrivé à un point en C++ où on peut ajouter de nouveaux
features, mais on ne peut pas toucher à l'existant.