Pour les artistes: quel code préférez vous? - Java - Programmation
Marsh Posté le 11-01-2005 à 17:06:03
en principe on ne doit pas jouer ainsi avec les exception. je veux dire par là. ton prog ne doit pas fonctionner avec celle-ci.
une levée d'exception est très lourde pour le système. si tu as un tableau de 100 éléments, je pense que la prémière solution est plus rapide.
rien n'empêche d'utiliser la première, c'est pas très catholique. Un peu comme ne pas utiliser de frein et d'attendre le déclenchement de l'airbag
Marsh Posté le 11-01-2005 à 18:19:06
JagStang a écrit : en principe on ne doit pas jouer ainsi avec les exception. je veux dire par là. ton prog ne doit pas fonctionner avec celle-ci. |
Tout pareil!
Quand tu fais une boucle, tu dois savoir quand t'arreter...
Marsh Posté le 11-01-2005 à 18:44:39
les exceptions sont en principe à n'utiliser que pour gérer les erreurs. En général, j'évite de les utiliser pour gérer les cas normaux dans le déroulement du prog.
Marsh Posté le 12-01-2005 à 08:03:55
Pareil, je vote pour la 1ere. QUand j'ai commancer le Java j'avais la mauvaise habitude d'utiliser les exceptions pour executer des bouts de code ... Une fois un gentil gaillard m'a mis en croix sur un forum, je n'ai jamais plus recidivé
Marsh Posté le 12-01-2005 à 08:10:09
Jubijub a écrit : si nraynaud passe ici, c pelle à clou assurée |
A mon avis, c'est pour ça qu'il ne poste pas ça en cat C++. Car il sait ce qui lui arriverait.
Marsh Posté le 12-01-2005 à 09:21:33
si déjà t'apprenais à te servir des exception, ça aiderait beaucoup ... sans référence, tu vas dans le mur.
Et en plus, ton usage est exactement ce à quoi ne servent pas les exceptions ...
Marsh Posté le 12-01-2005 à 10:10:14
Bon je vois que je suis un peu isolé à penser comme ça..
Mais si qqun avancait une raison (plutôt qu'une habitude), ça m'aiderait à comprendre..
Par exemple, esox_ch, pquoi n'as tu plus jamais récidivé? Quel était le défaut de la méthode?
Marsh Posté le 12-01-2005 à 10:22:54
JagStang a écrit : en principe on ne doit pas jouer ainsi avec les exception. je veux dire par là. ton prog ne doit pas fonctionner avec celle-ci. |
Ca m'a l'air d'etre une bonne raison d'éviter de s'en servir quand il n'y a pas lieu.
Marsh Posté le 12-01-2005 à 10:26:27
Au fait, c'est quoi qui rend lourd la levée d'exception ?
après tout, c'est juste un dépilage de la pile d'appel (avec test de la présence d'un catch à chaque fois) + mise à disposition de l'exception...
Ca semble pas particulièrement couteux, à priori ...
Marsh Posté le 12-01-2005 à 10:28:13
benou a écrit : Au fait, c'est quoi qui rend lourd la levée d'exception ? |
bein les sauts inconditionels + dépilage c'est pas bien méchant, mais c'est aussi une allocation de l'instance de l'exception.
Marsh Posté le 12-01-2005 à 10:29:10
schnapsmann a écrit : bein les sauts inconditionels + dépilage c'est pas bien méchant, mais c'est aussi une allocation de l'instance de l'exception. |
bha, l'allocation c'est pas bien méchant non plus quand même ...
Marsh Posté le 12-01-2005 à 10:33:10
benou a écrit : bha, l'allocation c'est pas bien méchant non plus quand même ... |
non mais pour un parcourt d'ensemble il vaut mieux jouer normalement avec les itérateurs que de compter sur le catch d'une exception "OutOfBoundWhathever", c'est quand même moins lourd.
Marsh Posté le 12-01-2005 à 10:37:23
benou a écrit : Au fait, c'est quoi qui rend lourd la levée d'exception ? |
Vu qu'il est en C++, je vais te faire une réponse C++:
Citation : The cost of throwing an exception one level on a 990 MHz Intel Pentium is around 12-13 micro seconds in the plain GNU g++ implementation |
. C'est suffisamment cher pour ne s'en servir qu'en cas... exceptionnels.
Le papier écrit pas les gars qui ont ajouté le support c++ au noyau linux donne plus d'infos:
http://netlab.ru.is/exception/KernelExceptions.pdf
En particulier, c'est le nettoyage de la pile qui coute le plus cher visiblement...
Marsh Posté le 12-01-2005 à 10:41:15
schnapsmann a écrit : non mais pour un parcourt d'ensemble il vaut mieux jouer normalement avec les itérateurs que de compter sur le catch d'une exception "OutOfBoundWhathever", c'est quand même moins lourd. |
je parlais dans le cas général. Dans ce cas précis, c'est évidement une bétise d'utiliser une exception ...
Lam's a écrit : Vu qu'il est en C++, je vais te faire une réponse C++: |
/o\
pour le chiffre donné, je suis surpris : ca doit quand même dépendre du context (exemple : la profondeur de la pile d'appel), c'est surprenant de donner un chiffre fixe, comme ca ...
Lam's a écrit : |
merci, j'irai jeter un coup d'oeil
Marsh Posté le 12-01-2005 à 10:47:53
benou a écrit : pour le chiffre donné, je suis surpris : ca doit quand même dépendre du context (exemple : la profondeur de la pile d'appel), c'est surprenant de donner un chiffre fixe, comme ca .. |
Bah visiblement non. Que ta pile fasse 1 octet ou 143000, ça reste du même ordre. Ce qui influe le plus, c'est la profondeur en terme de fonctions (et le chiffre donné correspond à une exception qui ne remonte qu'une seule fonction: "one level" )...
Après, comme le noyau linux ne contient pas de destructeurs (bah oui, vu qu'il y a pas de c++), ça ne tient pas compte de la destruction des objets...
Marsh Posté le 12-01-2005 à 11:05:38
benou a écrit : Au fait, c'est quoi qui rend lourd la levée d'exception ? |
(En c++ tu te farcis en plus l'appel des destructeurs que tu croises sur ton chemin)
Marsh Posté le 12-01-2005 à 11:07:50
le fait est qu'une fin de séquence n'est pas une situatuin exceptionnelle.
Marsh Posté le 12-01-2005 à 11:07:51
chrisbk a écrit : (En c++ tu te farcis en plus l'appel des destructeurs que tu croises sur tont chemin) |
ouais mais si tu étais passé par un autre méchansime que l'exception (genre code d'erreur en retour de fonction), le résultat aurait été le même, nan ?
edit : je ne vois que le malloc des données de l'objet exception en surcout ...
Marsh Posté le 12-01-2005 à 11:10:57
benou a écrit : ouais mais si tu étais passé par un autre méchansime que l'exception (genre code d'erreur en retour de fonction), le résultat aurait été le même, nan ? |
tout à fait, les desctructeurs font le ménage de manière automatique ce qui est l'apport majeur question "porpreté" des exceptions en c++
Marsh Posté le 12-01-2005 à 11:12:11
Lam's a écrit : Bah visiblement non. Que ta pile fasse 1 octet ou 143000, ça reste du même ordre. Ce qui influe le plus, c'est la profondeur en terme de fonctions (et le chiffre donné correspond à une exception qui ne remonte qu'une seule fonction: "one level" )... |
ceci dit pour les exceptions full user space c'est bien moins couteux
Marsh Posté le 12-01-2005 à 11:12:27
benou a écrit : ouais mais si tu étais passé par un autre méchansime que l'exception (genre code d'erreur en retour de fonction), le résultat aurait été le même, nan ? |
oué mais la tu te prends tout d'un coup dans la face, d'une part, et de l'autre l'appel aux destructeurs dans le cas du code d'erreur se fait 'naturellement' (dans le code tu as des appels explicite a toto::~toto()) tandis qu'avec l'exception je suppose qu'il faut aller les chercher toi même. (tel objet doit avoir son destructeur d'appelé) et cette recherche doit te couter qqchose.
sur la tambouille intérieure de comment ca marche, j'en ai aucune idée
Marsh Posté le 12-01-2005 à 11:16:52
chrisbk a écrit : tandis qu'avec l'exception je suppose qu'il faut aller les chercher toi même. |
les code flow "exceptionels" sont là pour ça non?
Marsh Posté le 12-01-2005 à 11:17:03
chrisbk a écrit : tandis qu'avec l'exception je suppose qu'il faut aller les chercher toi même. (tel objet doit avoir son destructeur d'appelé) et cette recherche doit te couter qqchose. |
sur ce point là, je vois pas de différence entre une levée d'exception et un "return;" par exemple ...
et puis les objets locaux (dont il faut appeler le destructeur) sont tous sur la pile de toute façon => y a pas besoin d'aller les chercher bien loin...
mais je suis ok pour l'argument du "tout d'un coup dans la face"
c'est peut être pour ca que la levée d'exception est moins critique en Java : la "destruction" des objets est désynchronisée par le GC ...
Marsh Posté le 12-01-2005 à 11:20:44
schnapsmann a écrit : les code flow "exceptionels" sont là pour ça non? |
je te confesserais n'en avoir pas la moindre idée. Mon Muchnick ne parle pas du tout d'exceptions, et j'ai jamais creusé outre mesure. Par contre si tu veux faire un pety exposé, je suis tout ouïe
Marsh Posté le 12-01-2005 à 11:22:14
Taz a écrit : c'est aussi pourça que java A BESOIN de blocks finally |
bien sur, mais il n'y a pas besoin de s'énerver pour ça
Marsh Posté le 12-01-2005 à 11:23:12
non, je m'énerve pas. Mais les destructeurs sont quand même géniaux pour cet aspect là.
Marsh Posté le 12-01-2005 à 11:24:49
bin tu surcharge finalize
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ok, je sors
Marsh Posté le 12-01-2005 à 11:28:24
tiens, en c#, si une exception est levé dans un block using(), ca appelle finalize() ?
Marsh Posté le 12-01-2005 à 11:29:00
Taz a écrit : c'est pas marrant |
rooh fais pas ta tronche, t'as juste a rajouter un gc.collect() dans tous tes blocks catch pour que ca marche, et hoppe
Marsh Posté le 12-01-2005 à 11:29:21
Taz a écrit : c'est aussi pourça que java A BESOIN de blocks finally |
je vois pas bien la relation entre les deux ... tu peux préciser stp ?
edit : ha ! peut être pour closer les trucs avant de se barrer à cause de l'exception ...
Marsh Posté le 12-01-2005 à 11:30:58
ben oui, sinon tu as une fuite de ressources. Ou un verrou non libéré, etc
Marsh Posté le 12-01-2005 à 11:32:35
usage canonique
res.acquire()
try
{
// ...
}
finally
{
res.release();
}
Marsh Posté le 12-01-2005 à 11:35:04
Taz a écrit : usage canonique |
ok, j'avais bien capté alors.
c'est vrai
Y a pas des cas où un release manuel des ressources est nécessaire ? (cas où le destructeur ne fait pas TOUT le boulot)
y a pas de finally en C++ ?
(remarque : c'est moche, mais en Java tu peux aussi faire les release dans chaque catch, t'es pas obligé d'utiliser finally )
Marsh Posté le 12-01-2005 à 11:35:31
chrisbk a écrit : tiens, en c#, si une exception est levé dans un block using(), ca appelle finalize() ? |
tu veux une fessée ?
Marsh Posté le 12-01-2005 à 11:36:28
benou a écrit : |
faut revoir le destructeur, alors
benou a écrit : |
et si tu catches pas l'exception, (si tu la laisse remonter), t'as pas un leger pb ?
Marsh Posté le 11-01-2005 à 16:58:14
Bon ok, c du c++, mais ça n'a pas d'importance, et j'ai pensé que j'aurais plus de gens habitués aux exceptions sur java.
C un exemple tt con. La fonction FctArray() envoie une Exception au bout d'un certain index.
Au boulot on me reproche de préférer la deuxième écriture.. J'avoue avoir du mal à supporter la première qd à moi.
Il m'arrive aussi d'écrire des chose du genre:
Ceci m'amène, si les comportements spécifiques nécessitent aussi la gestion d'exceptions (ds le cas de gros algos c fort probable), à avoir des exceptions imbriquées..
Critiquable aussi, ou tout à fait normal (et même préférable à une collection de if/else imbriqués)?
Merci.