Pour les artistes: quel code préférez vous?

Pour les artistes: quel code préférez vous? - Java - Programmation

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.
 

Code :
  1. //////////////////////////////////////////////////////////////////////////
  2. i=0;
  3. bool bFinished=false;
  4. while(!bFinished)
  5. {
  6.  try
  7.  { // Exception si en dehors du range.
  8.   FctArray(i++);
  9.  }
  10.  catch(Exception) {bFinished=true;}
  11. }
  12. //////////////////////////////////////////////////////////////////////////
  13. i=0;
  14. try
  15. {
  16.  while(true)
  17.  { // Exception si en dehors du range.
  18.   FctArray(i++);
  19.  }
  20. }
  21. catch(Exception) {}


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:

Code :
  1. try
  2. {
  3.    // fct susceptible d'envoyer une exception.
  4.    fct();
  5.    // Comportement spécifique en cas de succès de fct().
  6.    ...
  7. }
  8. catch(Exception)
  9. {
  10.    // Comportement spécifique en cas d'échec de fct().
  11.    ...
  12. }


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.

Reply

Marsh Posté le 11-01-2005 à 16:58:14   

Reply

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 :D

Reply

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...
 

Reply

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.

Reply

Marsh Posté le 11-01-2005 à 19:03:51    

si nraynaud passe ici, c pelle à clou assurée :)


---------------
Jubi Photos : Flickr - 500px
Reply

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é :p

Reply

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.  ;)

Reply

Marsh Posté le 12-01-2005 à 09:18:38    

itérateur bordel :fou:

Reply

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 ...

Reply

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?

Reply

Marsh Posté le 12-01-2005 à 10:10:14   

Reply

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.
 
une levée d'exception est très lourde pour le système.


 
Ca m'a l'air d'etre une bonne raison d'éviter de s'en servir quand il n'y a pas lieu.

Reply

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 ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

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 ?
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 ...


bein les sauts inconditionels + dépilage c'est pas bien méchant, mais c'est aussi une allocation de l'instance de l'exception.


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

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 ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

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.


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

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 ?
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 ...


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...

Reply

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 :


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


merci, j'irai jeter un coup d'oeil


---------------
ma vie, mon oeuvre - HomePlayer
Reply

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... :)
 
 

Reply

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 ?
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 ...


 
(En c++ tu te farcis en plus l'appel des destructeurs que tu croises sur ton chemin)


Message édité par chrisbk le 12-01-2005 à 11:06:33
Reply

Marsh Posté le 12-01-2005 à 11:07:50    

le fait est qu'une fin de séquence n'est pas une situatuin exceptionnelle.

Reply

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 ...


Message édité par benou le 12-01-2005 à 11:09:33

---------------
ma vie, mon oeuvre - HomePlayer
Reply

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 ?
edit : je ne vois que le malloc des données de l'objet exception en surcout ...


 
tout à fait, les desctructeurs font le ménage de manière automatique ce qui est l'apport majeur question "porpreté" des exceptions en c++


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

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" )...
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... :)


 
ceci dit pour les exceptions full user space c'est bien moins couteux


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

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 ?
edit : je ne vois que le malloc des données de l'objet exception en surcout ...


 
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


Message édité par chrisbk le 12-01-2005 à 11:12:56
Reply

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?


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

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 ...


Message édité par benou le 12-01-2005 à 11:17:49

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 12-01-2005 à 11:19:46    

c'est aussi pourça que java A BESOIN de blocks finally

Reply

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

Reply

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 [:icon7]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

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à.

Reply

Marsh Posté le 12-01-2005 à 11:24:49    

bin tu surcharge finalize [:icon7]
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ok, je sors [:petrus75]

Reply

Marsh Posté le 12-01-2005 à 11:27:14    

c'est pas marrant

Reply

Marsh Posté le 12-01-2005 à 11:28:24    

tiens, en c#, si une exception est levé dans un block using(), ca appelle finalize() ?

Reply

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 [:icon7]

Reply

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 ...


Message édité par benou le 12-01-2005 à 11:30:00

---------------
ma vie, mon oeuvre - HomePlayer
Reply

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

Reply

Marsh Posté le 12-01-2005 à 11:32:35    

usage canonique
 
 
res.acquire()
 
try
{
  // ...
}
finally
{
  res.release();
}

Reply

Marsh Posté le 12-01-2005 à 11:35:04    

Taz a écrit :

usage canonique


ok, j'avais bien capté alors.
 
c'est vrai :jap:
 
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 ;))


---------------
ma vie, mon oeuvre - HomePlayer
Reply

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 ?

Reply

Marsh Posté le 12-01-2005 à 11:36:28    

benou a écrit :


Y a pas des cas où un release manuel des ressources est nécessaire ? (cas où le destructeur ne fait pas TOUT le boulot)  


 
faut revoir le destructeur, alors
 

benou a écrit :


(remarque : c'est moche, mais en Java tu peux aussi faire les release dans chaque catch, t'es pas obligé d'utiliser finally ;))


 
et si tu catches pas l'exception, (si tu la laisse remonter), t'as pas un leger pb ?
 
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed