Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1008 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Gestion particulière d'exceptions à coup de finally...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gestion particulière d'exceptions à coup de finally...

n°703983
El_gringo
Posté le 20-04-2004 à 15:39:57  profilanswer
 

Je me demande si je suis en train de faire n'imp' ou pas.
Qqn pourra sans doute m'aiguiller.
J'utilise un pool de connections JDBC implémenté entant que driver JDBC.
Celui-ci impose néamoins une contrainte supplémentaire par rapport aux drivers JDBC habituels : il nécessite que soient fermés impérativement tous les ResultSet, Statement, et Connection.
Donc, après avoir "ouvert" une instance de chacune de ces 3 classes, la doc proconisait de procèder comme suit :

Code :
  1. try { if (r != null) r.close(); } catch (SQLException x) {;}
  2.            try { if (stmt != null) stmt.close(); } catch (SQLException x){;}
  3.            try { if (c != null) c.close(); } catch (SQLException x) {;}


 
Vous aurez compris ce que sont "r", "stmt", et "c", pas vrai ?
Cette méthode n'est pas terrible, puisqu'on perd la trace des exceptions éventuellement lancées. Je voudrais que ma méthode transmette ces éventuelles exceptions.  
J'ai fait un truc étrange, je me demande le comportement que ça peut avoir. Voici :

Code :
  1. try {
  2.             m_resultSet.close();
  3.         } finally {
  4.             try {
  5.                 m_statement.close();
  6.             } finally {
  7.                 m_connection.close();
  8.             }
  9.         }


 
Qqn à une idée ?

mood
Publicité
Posté le 20-04-2004 à 15:39:57  profilanswer
 

n°704025
xiluoc
un pc pour les unirs ....
Posté le 20-04-2004 à 15:54:42  profilanswer
 

hum, dans tous les cas quoi qu il arrive tu feras donc un m_connection.close();
donc je vois pas trop lutilite de faire un try sans catch nested.
 
maintenant j ai ptet rien compris ;)

n°704027
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 15:57:24  profilanswer
 

:heink: J'ai rien compris [:joce]
Stu veux transmettre tes exceptions, ba i suffit que ta méthode ait une clause throws dans sa signature, du style public int maMethode(char youpi) throws SQLException
et pis tout ce qui appellera maMethode() pourra catcher les SQLException [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704039
benou
Posté le 20-04-2004 à 16:01:03  profilanswer
 

moi j'ai compris ta question, et il me semble quoi oui : la seule solution est d'imbriquer les finnaly. D'un point de vue purement java en tout cas.
 
maintenant, je me suis toujours demandé si la fermetuer de la connection ne fermait pas aussi tous les trucs qui avaient été ouvert à travers elle ...
 
PS : Ce qu'il veut c'est être sûr de fermer sa connection, même si la fermeture du statement plante


Message édité par benou le 20-04-2004 à 16:01:34

---------------
ma vie, mon oeuvre - HomePlayer
n°704042
nerisson
Pic-pic
Posté le 20-04-2004 à 16:04:40  profilanswer
 

Normalement, lorsque l'on ferme un Statement il ferme également les ResultSet associés. Donc tu peut te passer de fermer le ResultSet.
Je crois que la meilleure solution est effectivement de mettre tes close() dans des clauses finally et de laisser remonter les SQLExceptions comme l'a dis Taiche.


---------------
Light is right
n°704044
benou
Posté le 20-04-2004 à 16:06:04  profilanswer
 

j'ai peut êter pas si bien compris la question que ca finalement [:meganne]


---------------
ma vie, mon oeuvre - HomePlayer
n°704071
El_gringo
Posté le 20-04-2004 à 16:31:49  profilanswer
 

Si si Benou, t'as parfaitement compris.

n°704073
El_gringo
Posté le 20-04-2004 à 16:32:36  profilanswer
 

benou a écrit :


maintenant, je me suis toujours demandé si la fermetuer de la connection ne fermait pas aussi tous les trucs qui avaient été ouvert à travers elle ...


 
Moi aussi je m'demande ça. Mais quand même, la doc de mon pool précise qu'il est important de tout fermer. Alors j'applique, bêtement...

n°704074
benou
Posté le 20-04-2004 à 16:33:14  profilanswer
 

c'est aussi ce que j'ai toujours fait par sécurité ..


---------------
ma vie, mon oeuvre - HomePlayer
n°704075
El_gringo
Posté le 20-04-2004 à 16:33:56  profilanswer
 

Et je me demande un truc : dans le code que j'ai donné au 1er post, avec tous les finally, si chacune des 3 fermeture lance une exception, au final, elle va transmettre laquelle ma mathode ?

mood
Publicité
Posté le 20-04-2004 à 16:33:56  profilanswer
 

n°704077
El_gringo
Posté le 20-04-2004 à 16:34:51  profilanswer
 

benou a écrit :

c'est aussi ce que j'ai toujours fait par sécurité ..


 
Ce qui veut dire que t'es forcé de faire un code ressemblant à mon bloc crado de finally ?
Vu que ça semble être le seul moyen d'être sur de faire toutes les fermetures.

n°704080
El_gringo
Posté le 20-04-2004 à 16:36:24  profilanswer
 

Taiche a écrit :

:heink: J'ai rien compris [:joce]
Stu veux transmettre tes exceptions, ba i suffit que ta méthode ait une clause throws dans sa signature, du style public int maMethode(char youpi) throws SQLException
et pis tout ce qui appellera maMethode() pourra catcher les SQLException [:spamafote]


 
Ben non. Comme Benou l'as précisé :
Si je fais simplement comme tu dis, si la 1ère fermeture (celle du ResultSet) lance une exception, on sort de la méthode, l'exception est transmise, mais ni le Statement, ni la Connection ne sont fermés.

n°704086
benou
Posté le 20-04-2004 à 16:41:24  profilanswer
 

el_gringo a écrit :

Ce qui veut dire que t'es forcé de faire un code ressemblant à mon bloc crado de finally ?
Vu que ça semble être le seul moyen d'être sur de faire toutes les fermetures.


ouais ... enfin tu fais une méthode utilitaire close(ResultSet, PreparedStatement, Connection)  qui fait tout ca comme il faut ...


---------------
ma vie, mon oeuvre - HomePlayer
n°704089
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 16:44:20  profilanswer
 

el_gringo a écrit :

Ben non. Comme Benou l'as précisé :
Si je fais simplement comme tu dis, si la 1ère fermeture (celle du ResultSet) lance une exception, on sort de la méthode, l'exception est transmise, mais ni le Statement, ni la Connection ne sont fermés.


Ouais non mais t'es marrant mais mon post c'était la 2ème réponse et je précisais bien que j'avais pas pigé ta question :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704091
El_gringo
Posté le 20-04-2004 à 16:45:44  profilanswer
 

benou a écrit :

ouais ... enfin tu fais une méthode utilitaire close(ResultSet, PreparedStatement, Connection)  qui fait tout ca comme il faut ...


 
Une méthode close qui contient le bout de code que j'ai posté, bien sur. C'est déja le cas. Je trouve ça pas bien beau comme code en tt cas. Tant pis pour l'esthétique de la méthode :D .

n°704097
El_gringo
Posté le 20-04-2004 à 16:47:44  profilanswer
 

Taiche a écrit :

Ouais non mais t'es marrant mais mon post c'était la 2ème réponse et je précisais bien que j'avais pas pigé ta question :o


 
Transmettre les exceptions, j'y arrive à peu près, merci ! :p  
 
PS : c'est vrai que comme mon post est pas tourné de manière hyper claire, désolé.

n°704098
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 16:48:21  profilanswer
 

el_gringo a écrit :

Transmettre les exceptions, j'y arrive à peu près, merci ! :p  


Ba t'sais, vu le nombre de mecs qui se pointent sans connaître le classpath, maintenant j'me méfie :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704099
benou
Posté le 20-04-2004 à 16:48:50  profilanswer
 

el_gringo a écrit :

Une méthode close qui contient le bout de code que j'ai posté, bien sur. C'est déja le cas.


si j'étais toi je rajouterait quelques if (leTruc != null) pour éviter les NullPointerException ;)


---------------
ma vie, mon oeuvre - HomePlayer
n°704102
El_gringo
Posté le 20-04-2004 à 16:52:47  profilanswer
 

benou a écrit :

si j'étais toi je rajouterait quelques if (leTruc != null) pour éviter les NullPointerException ;)


 
ha, c'était déja fait depuis que j'ai posté. Merci.
Et pour la question que j'ai posée, t'as une idée ?


Et je me demande un truc : dans le code que j'ai donné au 1er post, avec tous les finally, si chacune des 3 fermeture lance une exception, au final, elle va transmettre laquelle ma mathode ?

n°704105
El_gringo
Posté le 20-04-2004 à 16:53:35  profilanswer
 

Taiche a écrit :

Ba t'sais, vu le nombre de mecs qui se pointent sans connaître le classpath, maintenant j'me méfie :o


 
Je poste pas super souvent, mais j'pensais que tu connaissais mon pseudo qd même.
(faut pas être nerveux comme ça...) :hello:

n°704106
benou
Posté le 20-04-2004 à 16:55:02  profilanswer
 

el_gringo a écrit :

ha, c'était déja fait depuis que j'ai posté. Merci.
Et pour la question que j'ai posée, t'as une idée ?


Et je me demande un truc : dans le code que j'ai donné au 1er post, avec tous les finally, si chacune des 3 fermeture lance une exception, au final, elle va transmettre laquelle ma mathode ?




il me semble que les premières exceptions sont perdus et que seule la dernière est lancée. A vérifier ...


---------------
ma vie, mon oeuvre - HomePlayer
n°704110
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 16:57:15  profilanswer
 

el_gringo a écrit :

Je poste pas super souvent, mais j'pensais que tu connaissais mon pseudo qd même.


J't'avouerais que j'ai pas fait gaffe [:ddr555]

el_gringo a écrit :


(faut pas être nerveux comme ça...) :hello:  


:??:


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704113
El_gringo
Posté le 20-04-2004 à 16:59:06  profilanswer
 


 
rapport avec les p'tits bonshommes tout rouges à la fin de tes posts.

n°704114
El_gringo
Posté le 20-04-2004 à 17:00:12  profilanswer
 

benou a écrit :

il me semble que les premières exceptions sont perdus et que seule la dernière est lancée. A vérifier ...


 
Finalement, si les 1ères sont perdues, je peux aussi bien faire la 1ère méthode que j'évoquait (celle préconisée par la doc de mon API de pools), ça revient au même...

n°704117
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 20-04-2004 à 17:05:00  profilanswer
 

el_gringo a écrit :

rapport avec les p'tits bonshommes tout rouges à la fin de tes posts.


Ah ouais mais non :o Quand chu pas content, c'est :fou: ou [:toad666] ; le :o n'a pas grande signification en lui-même et c'est pour ça que j'le mets souvent :D


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°704129
El_gringo
Posté le 20-04-2004 à 17:15:58  profilanswer
 

Haaaaaaannnnnn, d'accord !
C'est noté. [:tobrainc]

n°704424
benou
Posté le 20-04-2004 à 23:52:49  profilanswer
 

el_gringo a écrit :

Finalement, si les 1ères sont perdues, je peux aussi bien faire la 1ère méthode que j'évoquait (celle préconisée par la doc de mon API de pools), ça revient au même...


ben non : avec la méthode dont tu parles tu perds toutes les exceptions ! en imbriquant les blocs finally tu ne perds les premières exceptions que si une autre est générée (de toute façon, tu ne peux pas throwser plusieurs exceptions ...).

n°704532
El_gringo
Posté le 21-04-2004 à 08:38:52  profilanswer
 

Ha oui, t'as raison, j'suis bête !
(Je m'en doute que je n'peux lancer qu'une seule exception).
 
Merci beaucoup en tout cas.


Message édité par El_gringo le 21-04-2004 à 08:39:18
n°783606
El_gringo
Posté le 01-07-2004 à 15:00:17  profilanswer
 

Au fait, juste une question :
si je ferme une connexion, sans fermer préalablement le(s) Statement et ResultSet qui y sont attaché(s), ça les ferme aussi, non ?

n°783650
nraynaud
lol
Posté le 01-07-2004 à 15:27:14  profilanswer
 

Citation :

AnapplicationcallsthemethodStatement.closetoindicatethatithasfinished processingastatement. All Statementobjectswill beclosedwhentheconnection thatcreatedthemisclosed. However, itisgoodcodingpracticeforapplicationsto closestatementsassoonastheyhavefinishedprocessingthem. Thisallowsany external resourcesthatthestatementisusingtobereleasedimmediately. ClosingaStatementobjectwill closeandinvalidateanyinstancesofResultSet producedbythatStatementobject. TheresourcesheldbytheResultSetobject maynotbereleaseduntil garbagecollectionrunsagain, soitisagoodpracticeto explicitlycloseResultSetobjectswhentheyarenolongerneeded. ThesecommentsaboutclosingStatementobjectsapplytoPreparedStatement andCallableStatementobjectsaswell.


 
spec JDBC 3.0 chapitre 3.1.3 "closing statement Objects" page 96. Copié avec un outil qui chie.


---------------
trainoo.com, c'est fini
n°783678
Bonhomme
Posté le 01-07-2004 à 15:44:32  profilanswer
 


 public static void releaseConnection(Connection conn) {
  try {
   if (conn != null) {
    conn.close();
   }
  }
  catch (SQLException se) {
   Log.error("EAISQL : releaseConnection", "Can't disconnect from session", se);
  }
 }
 
 public static void releaseStatement(Statement stmt) {
  try {
   if(stmt != null) {
    stmt.close() ;
   }
  }  
  catch (SQLException se) {
   Log.error("EAISQL : releasrStatement", "Can't close statement", se);
  }
 }


 
Perso j'ai fait des méthodes de ce type là pour ma part afin de lancer les close de mes Statement et Connection
 
et je les appelle comme ça :
 


        try {
            conn = newConnection();
            // Code....
        }
        catch (Exception e) {
            throw e;
        }
        finally {
            releaseConnection(conn);
        }


 
Edit : bon faut dire en plus que j'ai pas nécessairement besoin que la fermeture se passe bien globalement mais sinon les finally imbriqués ça me semble pas si mal
 
Bonhomme


Message édité par Bonhomme le 01-07-2004 à 15:46:04
n°783688
El_gringo
Posté le 01-07-2004 à 15:46:56  profilanswer
 

Outil qui chie sacrément, ouais.
En gros, on est pas obligé de les fermer, mais c'est conseillé. Je demandais ça à cause du pool de connexion dont je parlais au tout début de ce thread. Il ne devait pas implémenter correctement cette spec, parce qu'il demandaient dans la doc de bien TOUT fermer obligatoirement. Merci.

n°783694
El_gringo
Posté le 01-07-2004 à 15:49:37  profilanswer
 

Bonhomme a écrit :

[fixed]bon faut dire en plus que j'ai pas nécessairement besoin que la fermeture se passe bien globalement mais sinon les finally imbriqués ça me semble pas si mal


 
Pb de ta méthode : la connexion peut ne pas être fermée, sans que tu catch quoi que ce soit dans ton bloc principal. (même si tu enregistre ça dans ton log)

n°783698
nraynaud
lol
Posté le 01-07-2004 à 15:51:30  profilanswer
 

hého bonhomme, on en a déjà débatu au début de blablatech@java, je crois que 2 grandes méthodes méthodes étaient dégagés (dont la tienne en plus propre).


---------------
trainoo.com, c'est fini
n°783711
Bonhomme
Posté le 01-07-2004 à 15:56:07  profilanswer
 

nraynaud a écrit :

hého bonhomme, on en a déjà débatu au début de blablatech@java, je crois que 2 grandes méthodes méthodes étaient dégagés (dont la tienne en plus propre).


 
ouh là là les thread strop long j'ai du mal à les lire, c'est qu'il parait que des fois j'ai du boulot :)
 
Sinon effectivement la mienne c'est pas hyper propre mais bon quand on a pas le temps on se contente ce que l'on peut  :sweat:  
 
Bonhomme

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Gestion particulière d'exceptions à coup de finally...

 

Sujets relatifs
Gestion des thread sous LinuxExpressions régulieres: Besoin d'un coup de main
script de gestion de fichier?[C] Gestion d'une liaison rs 232
gestion de tournoi de jeux en phpGestion de demande de congés en ASP ( /!\ n00b inside)
[lien] PHP + XML en écriture : gestion accès multiples ?[résolu] PHP + XML en écriture : gestion accès multiples ?
[résolu] gestion d'erreursVerifier tous les champs d'un coup?
Plus de sujets relatifs à : Gestion particulière d'exceptions à coup de finally...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR