OVH Cloud OVH Cloud

Exceptions - Que fait ce code ?

8 réponses
Avatar
Zouplaz
Bonjour, si j'ai le code suivant

try {
// bloc 1
}
catch(Exception e)
{
// bloc 2
throw e;
}
finally
{
// bloc 3
}

Est-ce que bloc 3 est exécuté dans tous les cas, y compris si bloc2 fait un
rethrow ? A priori je dirais non... Ai-je tord ? Est-ce "mal" de faire un
throw dans un bloc catch ?


Merci

8 réponses

Avatar
Laurent Bossavit
Est-ce que bloc 3 est exécuté dans tous les cas, y compris si bloc2 fait un
rethrow ?


Oui.

A priori je dirais non... Ai-je tord ?


Oui. :)

Est-ce "mal" de faire un throw dans un bloc catch ?


Non.

Ce qui est "mal", et qu'il faut éviter, c'est d'inclure un "return",
"break" ou "continue" dans un bloc "finally". Précisément parce que si
le bloc "finally" est appelé à la suite d'une exception relancée, le
return (etc.) va faire repartir sur un traitement normal, et plus un
traitement d'exception.

Cf. http://pclt.cis.yale.edu/pclt/exceptions.htm

Laurent
http://bossavit.com/thoughts/

Avatar
Derek Sagan
Bonjour, si j'ai le code suivant

try {
// bloc 1
}
catch(Exception e)
{
// bloc 2
throw e;
}
finally
{
// bloc 3
}

Est-ce que bloc 3 est exécuté dans tous les cas, y compris si bloc2 fait un
rethrow ? A priori je dirais non... Ai-je tord ? Est-ce "mal" de faire un
throw dans un bloc catch ?


Merci


Pour ce genre de questions très précises, un coup de recherche plaintext
dans les specs du langage, est très efficace:
http://java.sun.com/docs/books/jls/index.html

Plus précisemment dans ton cas:
http://java.sun.com/docs/books/jls/second_edition/html/exceptions.doc.html#44153

Avatar
Bruno Jouhier
"Zouplaz" a écrit dans le message de news:

Bonjour, si j'ai le code suivant

try {
// bloc 1
}
catch(Exception e)
{
// bloc 2
throw e;
}
finally
{
// bloc 3
}

Est-ce que bloc 3 est exécuté dans tous les cas, y compris si bloc2 fait
un
rethrow ?


Oui, il est exécuté dans tous les cas

A priori je dirais non... Ai-je tord ?


Tort. Oui.

Est-ce "mal" de faire un
throw dans un bloc catch ?


Pas du tout. Si l'action qui précède n'a pas permis à la méthode de remplir
son contrat, il faut faire un rethrow.

Le bloc catch n'est pas obligatoire (le bloc finally non plus, mais il faut
au moins un des 2). Donc si vous êtes améné à écrire un clause catch du
genre
catch (Exception ex) { throw ex; }
vous pouvez l'éliminer et garder seulement le try/finally, elle ne sert
stictement à rien.



Merci


Avatar
Bruno Jouhier
"Laurent Bossavit" a écrit dans le message de
news:
Est-ce que bloc 3 est exécuté dans tous les cas, y compris si bloc2 fait
un
rethrow ?


Oui.

A priori je dirais non... Ai-je tord ?


Oui. :)

Est-ce "mal" de faire un throw dans un bloc catch ?


Non.

Ce qui est "mal", et qu'il faut éviter, c'est d'inclure un "return",
"break" ou "continue" dans un bloc "finally". Précisément parce que si
le bloc "finally" est appelé à la suite d'une exception relancée, le
return (etc.) va faire repartir sur un traitement normal, et plus un
traitement d'exception.


Tout à fait! Ca devrait être détécté et refusé par le compilateur (c'est le
cas en C# mais pas en Java).


Cf. http://pclt.cis.yale.edu/pclt/exceptions.htm

Laurent
http://bossavit.com/thoughts/



Avatar
Olivier Thomann
Ce qui est "mal", et qu'il faut éviter, c'est d'inclure un "return",
"break" ou "continue" dans un bloc "finally". Précisément parce que si
le bloc "finally" est appelé à la suite d'une exception relancée, le
return (etc.) va faire repartir sur un traitement normal, et plus un
traitement d'exception.
Tout à fait! Ca devrait être détécté et refusé par le compilateur (c'est le

cas en C# mais pas en Java).
Note que le compilateur d'Eclipse detecte ce cas et peut te renvoyer une

erreur ou un warning selon les preferences de l'utilisateur.
--
Olivier


Avatar
Alain
Olivier Thomann wrote:

Ce qui est "mal", et qu'il faut éviter, c'est d'inclure un "return",
"break" ou "continue" dans un bloc "finally". Précisément parce que si
le bloc "finally" est appelé à la suite d'une exception relancée, le
return (etc.) va faire repartir sur un traitement normal, et plus un
traitement d'exception.
Tout à fait! Ca devrait être détécté et refusé par le compilateur

(c'est le cas en C# mais pas en Java).
Note que le compilateur d'Eclipse detecte ce cas et peut te renvoyer une

erreur ou un warning selon les preferences de l'utilisateur.


je ne crois pas qu'il y ait de "compilateur d'eclipse". il utilise le
compilateur du JDK je crois ?
donc c'est dans le compilo standar, mais probablement que l'option de
warning est inactivé. l'est elle vraiement ?



Avatar
Olivier Thomann
je ne crois pas qu'il y ait de "compilateur d'eclipse". il utilise le
compilateur du JDK je crois ?
donc c'est dans le compilo standar, mais probablement que l'option de
warning est inactivé. l'est elle vraiement ?
Qu'est-ce qui te fait dire cela?

Je peux te dire de source sure qu'Eclipse a son propre compilateur. Ce
compilateur peut etre utilise seul, dans un script ant ou dans Eclipse.

L'option pour detecter les block finally qui retournent est activee par
defaut. Sinon pour ceux que ca interesse, le nom de l'option est:
-warn:finally
--
Olivier

Avatar
Wismerhill
Alain ecrivit le 12/02/2005 15:09 :


Olivier Thomann wrote:


Ce qui est "mal", et qu'il faut éviter, c'est d'inclure un "return",
"break" ou "continue" dans un bloc "finally". Précisément parce que si
le bloc "finally" est appelé à la suite d'une exception relancée, le
return (etc.) va faire repartir sur un traitement normal, et plus un
traitement d'exception.


Tout à fait! Ca devrait être détécté et refusé par le compilateur
(c'est le cas en C# mais pas en Java).


Note que le compilateur d'Eclipse detecte ce cas et peut te renvoyer
une erreur ou un warning selon les preferences de l'utilisateur.



je ne crois pas qu'il y ait de "compilateur d'eclipse". il utilise le
compilateur du JDK je crois ?
donc c'est dans le compilo standar, mais probablement que l'option de
warning est inactivé. l'est elle vraiement ?


Non, Eclipse contient son propre compilateur.