J'ai un lecteur de carte bancaire pour lequel on me fournit une DLL pour le piloter. J'aimerais en faire une classe RAII. Si un problème survient lors de la transaction, alors une exception est envoyée.
Voici un exemple très simplifié du problème:
Le destructeur ferme une session ainsi qu'une connexion (bien sûr si elles sont ouvertes, par soucis de visibilité, je ne l'ai pas intégré dans le code exemple). Ces fonctions peuvent renvoyer une erreur dans la DLL, j'aimerais donc pouvoir lancer une exception. Cependant, un destructeur ne doit jamais envoyer d'exception. D'où le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class CDistributorRAII { public: CDistributorRAII() {} ~CDistributorRAII() { CloseSession(); Disconnect(); } void Connect() { if (!distributor_connect()) throw CConnectionException(); } void OpenSession() { if (!distributor_open_session()) throw CSessionException(); } void ProcessTransaction(float fAmount) { if (!distributor_process_transaction()) throw CTransactionException(); } bool CloseSession() { if (!distributor_close_session()) throw CSessionException(); } bool Disconnect() { if (!distributor_disconnect()) throw CConnectionException(); } }; try { CDistributor distributor; distributor.Connect(); distributor.OpenSession(); distributor.ProcessTransaction(49.90); } catch (CDistributorException &e) { cerr << e.what() << endl; }
Pour résoudre ce problème, je suppose que je dois faire des classes RAII pour une connection et une session?
Partager