Gestion effective des exceptions

Gestion effective des exceptions - C#/.NET managed - Programmation

Marsh Posté le 03-02-2005 à 11:26:02    

Bon je post ça dans la cat .NET, mais ça peut concerner n'importe quel langage qui gère les exceptions (genre en Java ça marche aussi).
 
Donc je me questionne sur le meilleur moyen pour gérer une exception dans le cas que je vais vous présenter.
 
Donc c'est tout simple : mon application accède à des données dans une base. Pour offrir un maximum d'abstraction, les classes d'accès aux données sont définies par des interfaces. La première est IProvider, dont les classes héritées vont contenir les données, permettre de les charger, de les sauvegarder, de créer une nouvelle base, etc.
 
Ensuite pour pouvoir créer une nouvelle base, j'ai aussi utilisé une interface, ICreator. Car suivant les provider, les méthodes de création sont pas les mêmes (genre en OleDb, entre une base Access et une base SQL Server, ce sera pas le même Creator, par contre on peut avoir le même Provider).
 
Voici en gros un morceau de code (VB.NET) :

Code :
  1. Public MustInherit Class Provider
  2.   Implements IProvider
  3.   Private Creator as ICreator
  4.   ...
  5.   Public Sub Create() Implements IProvider.Create
  6.     Me.Creator.Create(Me.Connection)
  7.     Me.Creator.AppendTables()
  8.     Me.Creator.SetPermissions()
  9.   End Sub
  10.   ...
  11. End Class


 
Et un exemple de la méthode Create dans mon ICreator, ici avec une base Access :

Code :
  1. Public NotInheritable Class MdbCreator
  2.   Implements ICreator
  3.   Public Sub Create(ByVal connection As OleDb.OleDbConnection) Implements ICreator.Create
  4.  
  5.     Dim Cat As New ADOX.Catalog
  6.     Cat.Create(connection.ConnectionString)
  7.   End Sub
  8.    ....
  9. End Class


 
Donc maintenant, il se peut qu'il arrive un problème lors de l'appel à la méthode ICreator.Create : pas assez d'espace disque pour les base access, connexion impossible pour les SQL Server, etc... Chaque ICreator peut rencontrer son problème lors de la création de la base.
 
Donc ma question : Quel est le meilleur moyen pour gérer une telle exception, sachant que dans la classe Provider, je ne connais pas à l'avance le Creator :??:
 
Donc déjà ce que je peut faire, c'est mettre un bloc Try...Catch dans ma méthode ICreator.Create, afin de catcher une exception et afficher le bon message d'erreur. Mais maintenant quel est le meilleur moyen pour signaler au Provider qu'une erreur est survenue ?
 
Genre je lève une exception qui sera catchée par le Provider. Ou alors pas de Try dans le Creator, on met tout dans le Provider, mais alors il faut un moyen pour customiser le message d'erreur...
 
Bon ça paraît tout simple comme problème, c'est d'ailleurs tout simple,  mais comme plusieurs solutions sont possible, je voudrais savoir votre point de vue là-dessus :)

Reply

Marsh Posté le 03-02-2005 à 11:26:02   

Reply

Marsh Posté le 03-02-2005 à 13:21:47    

bin tu te fais ta hierarchie d'exception et tu convertis les exceptions specifique a un type de bd (postgres, machin, access) en ces exceptions generiques, non ?

Reply

Marsh Posté le 03-02-2005 à 13:23:36    

Ah ouais c'est pas con :)
 
Genre je fais mon try dans ICreator.Create (nécessaire, car en cas d'erreur une COMException est levée), puis je balance genre une MdbCreatorException, héritée de CreatorException.

Reply

Marsh Posté le 03-02-2005 à 13:25:38    

chui perdu dans ton affaire, ICreator etant une interface, y'a pas de definition de ICreator.Create.  
Bref, chaque classe implantant ICreator doit avoir le même comportement, et donc generer les mêmes erreurs, c'est la le pivot de l'affaire

Reply

Marsh Posté le 03-02-2005 à 13:31:31    

Ouaip, apparemment on peut pas forcer une méthode d'interface à lever une exception. Faudra bien faire gaffe à lever l'exception dans l'implémentation :/

Reply

Marsh Posté le 03-02-2005 à 13:31:57    

je savais bien que ca finirait en débat checked/unchecked [:franck75]

Reply

Marsh Posté le 03-02-2005 à 13:33:30    

lol :D
Dommage qu'on puisse pas définir dans l'interface un truc style :

Sub Create() Throws Exception

Reply

Marsh Posté le 03-02-2005 à 13:36:09    

Reply

Marsh Posté le 03-02-2005 à 13:45:26    

Ok je vois, pas facile tout ça... Je crois le mieux c'est que chaque classe implémentant ICreator lance la même exception, qui sera récupérée par le Provider...

Reply

Marsh Posté le 03-02-2005 à 13:46:24    

Vous voulez pas terminer votre discu en MP ? :o Tout le monde s'en fout, de .NET, personne l'utilise [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 03-02-2005 à 13:46:24   

Reply

Marsh Posté le 03-02-2005 à 13:47:58    

:??: on est sur mon topic, qu'est-ce que tu délires ?

Reply

Marsh Posté le 03-02-2005 à 13:51:28    

FlorentG a écrit :

:??: on est sur mon topic, qu'est-ce que tu délires ?


Ba vous êtes 2 à taper la discute sur un sujet pareil ; or, comme on l'a vu dans le sondage d'Yvele, personne n'utilise .NET :o Donc hopopop, vous faites tout ça en MP et reste bons amis [:icon7]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 03-02-2005 à 13:55:29    

... Et si quelqu'un d'autre venait en parler ?

Reply

Marsh Posté le 03-02-2005 à 13:56:53    

Ca arrivera jamais :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 03-02-2005 à 14:07:36    

Taiche, espece de charlot [:icon8]

Reply

Marsh Posté le 03-02-2005 à 14:08:17    

[:sisicaivrai]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 03-02-2005 à 14:09:36    

Pourrions-nous recenter la discussion ? ;)
 
Ou sinon une autre solution est de faire toute la gestion d'erreur dans ICreator. Et en cas d'erreur, on renvoi false. Le provider n'aura qu'a tester si la fonction renvoi true ou false pour continuer...

Reply

Marsh Posté le 03-02-2005 à 14:11:35    

mais ICreator c'est une interface [:petrus75]
(et la gestion d'erreur au code de retour ca craint des fesses)

Reply

Marsh Posté le 03-02-2005 à 14:15:35    

Ouaip, ça craint un max :(, ça fait vieux :D
 
Galère tout ça tout de même... Ou alors au lieu de déclarer une interface ICreator, je la déclare en classe abstraite avec un peu de gestion d'erreurs...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed