Gestion particulière d'exceptions à coup de finally... - Java - Programmation
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
Marsh Posté le 20-04-2004 à 15:57:24
J'ai rien compris
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
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
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.
Marsh Posté le 20-04-2004 à 16:06:04
j'ai peut êter pas si bien compris la question que ca finalement
Marsh Posté le 20-04-2004 à 16:32:36
benou a écrit : |
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...
Marsh Posté le 20-04-2004 à 16:33:14
c'est aussi ce que j'ai toujours fait par sécurité ..
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 ?
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.
Marsh Posté le 20-04-2004 à 16:36:24
Taiche a écrit : J'ai rien compris |
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.
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 ? |
ouais ... enfin tu fais une méthode utilitaire close(ResultSet, PreparedStatement, Connection) qui fait tout ca comme il faut ...
Marsh Posté le 20-04-2004 à 16:44:20
el_gringo a écrit : Ben non. Comme Benou l'as précisé : |
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
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 .
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 |
Transmettre les exceptions, j'y arrive à peu près, merci !
PS : c'est vrai que comme mon post est pas tourné de manière hyper claire, désolé.
Marsh Posté le 20-04-2004 à 16:48:21
el_gringo a écrit : Transmettre les exceptions, j'y arrive à peu près, merci ! |
Ba t'sais, vu le nombre de mecs qui se pointent sans connaître le classpath, maintenant j'me méfie
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
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 ?
|
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 |
Je poste pas super souvent, mais j'pensais que tu connaissais mon pseudo qd même.
(faut pas être nerveux comme ça...)
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.
|
il me semble que les premières exceptions sont perdus et que seule la dernière est lancée. A vérifier ...
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
el_gringo a écrit : |
Marsh Posté le 20-04-2004 à 16:59:06
ReplyMarsh 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...
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 Quand chu pas content, c'est ou ; le n'a pas grande signification en lui-même et c'est pour ça que j'le mets souvent
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 ...).
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.
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 ?
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.
Marsh Posté le 01-07-2004 à 15:44:32
|
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 :
|
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
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.
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)
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).
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
Bonhomme
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 :
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 :
Qqn à une idée ?