Bonjour à tous
Je n'ai pas trés bien compris la sémentique du composant "Exception Handler"
du diagramme d'activité d'ML (surtout le principe de propagation du traitement de l'exception...). Pourriez vous me donner un petit exemple là dessus ?
Merci
Version imprimable
Bonjour à tous
Je n'ai pas trés bien compris la sémentique du composant "Exception Handler"
du diagramme d'activité d'ML (surtout le principe de propagation du traitement de l'exception...). Pourriez vous me donner un petit exemple là dessus ?
Merci
A la base il n'y a rien de particulier dans la propagation d'une exception en UML, il se passe la même chose que lorsqu'il y a une exception dans un programme C++ Java etc ...
dans un langage comme Java ou C++ l'exception interrompt l'exécution du bout de code courant, et on donne la main au dernier catch imbriqué traitant l'exception.
en UML, si l'exception arrive dans une action, le déroulement de l'action est interrompu, si cette action à un handler pour l'exception ce dernier est exécuté, sinon on regarde dans le conteneur de l'action ou appelant (si possible c.a.d. si appel synchrone), si celui-ci n'a pas de handler correspondant on regarde un cran plus loin etc ... c'est comme la 'recherche' du catch C++/Java
il y a aussi des facilités comme les régions interruptibles pour éviter d'avoir des diagrammes illisibles ou on écrit une seule fois ce qui se passe pour chaque exception pour tout ce qui est dans la région (évidemment il faut que le traitement de chaque exception soit le même pour tous)
Bonjour
Merci bruno_pages pour cette réponse.
J'aimerais avoir un petit éclaircissement sur un point:
Pour reprendre votre explication:
en UML, si l'exception arrive dans une action, le déroulement de l'action est interrompu, si cette action à un handler pour l'exception ce dernier est exécuté, sinon on regarde dans le conteneur de l'action ou appelant (si possible c.a.d. si appel synchrone), si celui-ci n'a pas de handler correspondant on regarde un cran plus loin etc
On regarde si le conteneur de l'action (qui soulevé l'exception) à un handler correspondant si l'action qui a soulevé l'exception n'est pas protégée. Que se passe t il si l’action est dite protégée et qu’un handler n’est pas trouvé ?
Dans le cas ou l’activité n’est pas protégée : si le conteneur n'a pas de handler correspondant ,est ce qu'il y a arrêt de ce niveau lorsqu'on recherche le handler dans le niveau plus haut (l’activité l’englobant), c'est à dire lorsqu'on essaye de voir à chaque fois plus loin pour trouver un handler, est ce qu'il y a pour chaque niveau visité (ou est propagé l'exception) arrêt de l'exécution du niveau en question et lorsqu'on reprend l'exécution après avoir trouvé le handler correspondant, est ce la reprise se fait au niveau du dernier niveau où le handler à été trouvé ou bien en retourne au niveau de l’activité où l'exception à été levée.
J'aurais également une autre question qui n' a pas vraiment un rapport avec le titre du sujet:
Je n'ai pas compris la différence entre l'exécution d'une région d'expansion en mode "itératif" et en mode "stream" ? Est ce qu'il y a plusieurs exécution de la région dans le deuxième cas ou pas ?
Merci
Bonjour
je ne comprends pas la question car protection == handler_présent
la reprise se fait au niveau où se trouve le handler, exactement comme en C++/Java
par exemple le prog C++ suivant :
fera les affichages suivants :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30#include <stdio.h> void g() { puts("g / affiche"); throw 0; puts("g / pas affiche"); } void f() { puts("f / affiche"); try { puts("f / affiche aussi"); g(); puts("f / pas affiche"); } catch(int) { puts("f / handler"); } puts("f / reprise apres handler"); } int main(int argc, char ** argv) { puts("appel f"); f(); puts("apres f"); }
un équivalent had oc via des activités serait :Code:
1
2
3
4
5
6
7 appel f f / affiche f / affiche aussi g / affiche f / handler f / reprise apres handler apres f
http://bouml.fr/act_main.png
http://bouml.fr/act_f.png
http://bouml.fr/act_g.png
une seule execution, c'est écrit explicitement dans la norme
mais c'est bizarre ...
Bruno
Bonjour,
Merci pour ces explications !