OVH Cloud OVH Cloud

Gestion des Exceptions

25 réponses
Avatar
Michael Moreno
Bonjour,

Il me semble qu'en C++, le try-finally n'existe pas.

Je me demande par consequent quelle est la facon pour eviter la
repetition de code du genre

EnterCriticalSection(...);
try
{
...
LeaveCriticalSection(...);
}
catch(...)
{
LeaveCriticalSection(...);
}

Merci pour votre aide,

Michael

--
----
http://michael.moreno.free.fr/

5 réponses

1 2 3
Avatar
Arnaud Debaene
Matthieu Moy wrote:
"Arnaud Debaene" writes:

Donnes-nous un exemple où ce mécanisme ne serait pas
satisfaisant.


Est-ce qu'on peut exprimer

Lock(A);
...
Lock(B);
...
Unlock(A);
...
Unlock(B);


Non, mais je ne connais aucun moyen "automatique" qui permette de faire çà.

Arnaud


Avatar
Alexis Nikichine
Arnaud Debaene wrote:
Matthieu Moy wrote:

"Arnaud Debaene" writes:


Donnes-nous un exemple où ce mécanisme ne serait pas
satisfaisant.


Est-ce qu'on peut exprimer

Lock(A);
...
Lock(B);
...
Unlock(A);
...
Unlock(B);



Non, mais je ne connais aucun moyen "automatique" qui permette de faire çà.


La fonctionnalité Dismiss des ScopeGuards que tu as mentionnés ne
fait-elle pas l'affaire ? D'accord, si une exception est levée avant le
premier Dismiss de Lock A (ie, avant le Unlock A), les Unlocks seront
fait dans l'ordre inverse des Locks, mais le résultat sera là.

Alexis

--
Un certain domaine est free



Avatar
Arnaud Debaene
Alexis Nikichine wrote:
Arnaud Debaene wrote:
Matthieu Moy wrote:

"Arnaud Debaene" writes:


Donnes-nous un exemple où ce mécanisme ne serait pas
satisfaisant.


Est-ce qu'on peut exprimer

Lock(A);
...
Lock(B);
...
Unlock(A);
...
Unlock(B);



Non, mais je ne connais aucun moyen "automatique" qui permette de
faire çà.


La fonctionnalité Dismiss des ScopeGuards que tu as mentionnés ne
fait-elle pas l'affaire ?
Je ne vois pas comment. Au mieux, Dismiss va permettre de ne pas appeler un

Unlock il me semble... Postes un exemple de ce à quoi tu penses...

Arnaud




Avatar
Alexis Nikichine
Arnaud Debaene wrote:
Alexis Nikichine wrote:

Arnaud Debaene wrote:

Matthieu Moy wrote:


"Arnaud Debaene" writes:



Donnes-nous un exemple où ce mécanisme ne serait pas
satisfaisant.


Est-ce qu'on peut exprimer

Lock(A);
...
Lock(B);
...
Unlock(A);
...
Unlock(B);



Non, mais je ne connais aucun moyen "automatique" qui permette de
faire çà.


La fonctionnalité Dismiss des ScopeGuards que tu as mentionnés ne
fait-elle pas l'affaire ?


Je ne vois pas comment. Au mieux, Dismiss va permettre de ne pas appeler un
Unlock il me semble... Postes un exemple de ce à quoi tu penses...


Euh, non, tu as raison, ça fait le contraire :-) Personne ne voudrait
Dismisser (et donc, garder locké à tout jamais) un mutex, non ?

La confusion doit me venir de ce que quelques temps avant de lire
l'article sur les ScopeGuards, j'avais écrit une classe Lock à laquelle
j'avais ajouté une méthode void Lock::earlyUnlock(), pour les cas où il
était nécesaire de releaser un mutex plutôt que prévu.

Maintenant, on pourrait peut-être rajouter une méthode "earlyRelease" au
ScopeGuard pour lui dire "fais ton nettoyage maintenant".

Alexis

--
Un certain domaine est libre.





Avatar
Marc Boyer
In article , Matthieu Moy wrote:
"Arnaud Debaene" writes:

Donnes-nous un exemple où ce mécanisme ne serait pas
satisfaisant.


Est-ce qu'on peut exprimer

Lock(A);
...
Lock(B);
...
Unlock(A);
...
Unlock(B);


En y re-réflechissant, tu dois pouvoir, en mettant explictement
une methode unlock, un attribut "locked" et un destructeur qui
fait le unlock si ça n'a pas déjà été fait.

class Lock {
bool locked;
...
public:
Lock(): locked(true) { ... }
unlock() { ... ; locked= false; }
~Lock() { if (locked) ... }
}

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


1 2 3