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

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

Marsh Posté le 20-04-2004 à 15:39:57    

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 ?

Reply

Marsh Posté le 20-04-2004 à 15:39:57   

Reply

Marsh Posté le 20-04-2004 à 15:54:42    

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

Reply

Marsh Posté le 20-04-2004 à 15:57:24    

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

Marsh Posté le 20-04-2004 à 16:01:03    

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
Reply

Marsh Posté le 20-04-2004 à 16:04:40    

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
Reply

Marsh Posté le 20-04-2004 à 16:06:04    

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


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

Marsh Posté le 20-04-2004 à 16:31:49    

Si si Benou, t'as parfaitement compris.

Reply

Marsh Posté le 20-04-2004 à 16:32:36    

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

Reply

Marsh Posté le 20-04-2004 à 16:33:14    

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


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

Marsh Posté le 20-04-2004 à 16:33:56    

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 ?

Reply

Marsh Posté le 20-04-2004 à 16:33:56   

Reply

Marsh Posté le 20-04-2004 à 16:34:51    

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.

Reply

Marsh Posté le 20-04-2004 à 16:36:24    

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.

Reply

Marsh Posté le 20-04-2004 à 16:41:24    

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
Reply

Marsh Posté le 20-04-2004 à 16:44:20    

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

Marsh Posté le 20-04-2004 à 16:45:44    

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 .

Reply

Marsh Posté le 20-04-2004 à 16:47:44    

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

Reply

Marsh Posté le 20-04-2004 à 16:48:21    

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

Marsh Posté le 20-04-2004 à 16:48:50    

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
Reply

Marsh Posté le 20-04-2004 à 16:52:47    

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 ?

Reply

Marsh Posté le 20-04-2004 à 16:53:35    

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:

Reply

Marsh Posté le 20-04-2004 à 16:55:02    

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
Reply

Marsh Posté le 20-04-2004 à 16:57:15    

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

Marsh Posté le 20-04-2004 à 16:59:06    


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

Reply

Marsh Posté le 20-04-2004 à 17:00:12    

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

Reply

Marsh Posté le 20-04-2004 à 17:05:00    

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

Marsh Posté le 20-04-2004 à 17:15:58    

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

Reply

Marsh Posté le 20-04-2004 à 23:52:49    

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

Reply

Marsh Posté le 21-04-2004 à 08:38:52    

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
Reply

Marsh Posté le 01-07-2004 à 15:00:17    

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 ?

Reply

Marsh Posté le 01-07-2004 à 15:27:14    

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
Reply

Marsh Posté le 01-07-2004 à 15:44:32    


 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
Reply

Marsh Posté le 01-07-2004 à 15:46:56    

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.

Reply

Marsh Posté le 01-07-2004 à 15:49:37    

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)

Reply

Marsh Posté le 01-07-2004 à 15:51:30    

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
Reply

Marsh Posté le 01-07-2004 à 15:56:07    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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