Créer des rapports d'erreurs sous Access
Date de publication : 20/12/2005
Par
Christophe WARIN
Ce tutoriel constitue un exemple simple et
puissant destiné à faciliter le débogage et la maintenance sur site d'applications Access.
Prés requis
Introduction
1. Création de la classe GestionnaireErreur
1.A. Manipuler un fichier texte
1.B. Ouverture du fichier texte
1.C. Ecriture dans le fichier texte
1.D. Fermeture du fichier
2. Utilisation de l'objet GestionnaireErreur dans votre application
2.A. Instanciation d'un nouvel objet au démarrage
2.B. Utilisation dans les procédures du projet
Conclusion
Liens utiles
Prés requis
Introduction
Lors des premiers jours d'utilisation de vos applications Access
suivant leur déploiement, vous devez parfois exécuter certaines
tâches de maintenance. Vous devez alors faire confiance à l'utilisateur
en ce qui concerne les différents messages d'erreur qu'il a pu rencontrer.
Malheureusement, ses dires ne reflètent pas toujours la réalité.
Aussi une solution simple consiste à enregistrer ces messages
d'erreur dans un fichier texte qui portera le même nom que
l'application suivi de l'extension .log (Fichier de log d'erreur).
Toutefois, il serait fastidieux d'avoir à écrire des lignes de
code relatives aux manipulations de ce fichier texte dans
chaque procédure de votre projet. La meilleure approche consiste
donc à créer une classe d'objet qui se chargera d'ouvrir le fichier
texte, d'écrire les informations à l'intérieur, ainsi que de le fermer.
1. Création de la classe GestionnaireErreur
Il s'agit là d'une classe toute simple dotée d'un seul attribut et de trois méthodes publiques.
Attribut privé
Méthodes publiques
- Instancier
- EnregistrerErreur
- Fermer
1.A. Manipuler un fichier texte
Il existe plusieurs techniques pour manipuler les fichiers texte.
Il est ainsi possible d'utiliser des fonctions VBA (Open, Print),
des fonctions de l'API Windows ou bien encore les objets TextStream
de la référence Microsoft Scritping Runtime.
Celle retenue ici sera l'utilisation des TextStream.
La raison est assez simple. Les opérations effectuées sur les
fichiers texte avec les fonctions Open et Print de VBA
ne sont pas instantanées. Les modifications sont apportées en mémoire
mais ne sont écrites qu'à la fermeture du fichier texte.
Autrement dit, cela vous obligerait à fermer et ouvrir le fichier
texte à chaque inscription d'une erreur. Quant aux fonctions de
l'API Windows, leur programmation est beaucoup trop compliquée
pour le résultat escompté. Il est de loin préférable de tirer
partie des possibilités offertes pas les objets TextStream.
Il vous faut donc ajouter la référence Microsoft Scripting Runtime à votre projet.
Insérez ensuite un nouveau module de classe à votre projet VBA
et sauvegardez le sous le nom de GestionnaireErreur.
1.B. Ouverture du fichier texte
L'ouverture du fichier texte se fait lors de l'appel de la méthode
Instancier de l'objet GestionnaireErreur.
Cette méthode reçoit donc le nom du fichier comme paramètre.
Une fois le fichier ouvert, l'objet TextStream résultant
est affecté à la variable privée oFichierLog à l'aide de la
méthode OpenTextFile de l'objet FileSystemObject.
Public Sub Instancier(strnomfichier As String)
On Error GoTo GestionErreur
Dim oFso As New FileSystemObject
Set oFichierLog = oFso.OpenTextFile(strnomfichier, ForAppending, True)
GoTo Fin
GestionErreur:
MsgBox "Impossible d'instancier le gestionnaire d'erreurs", vbCritical
Fin:
End Sub |
1.C. Ecriture dans le fichier texte
Une fois l'objet TextStream instancié, il est possible d'appeler
sa méthode WriteLine afin d'écrire une nouvelle ligne dans le fichier texte.
Cette opération est exécutée par la procédure EnregistrerErreur.
Elle reçoit comme paramètre le numéro de l'erreur à enregistrer,
sa description ainsi que le nom de la procédure qui l'a déclenchée.
Public Sub EnregistrerErreur(intErrNumber As Integer, _
strErrMessage As String, Optional strNomProc = "")
On Error GoTo GestionErreur
If Not oFichierLog Is Nothing Then
oFichierLog.WriteLine "[" & Now & "] Procédure : " & _
strNomProc & " -> " & intErrNumber & ":" & strErrMessage
Else
MsgBox "Le gestionnaire d'erreur n'est pas instancié", vbCritical
End If
GoTo Fin
GestionErreur:
MsgBox "Impossible d'écrire dans le fichier du gestionnaire d'erreur.", vbCritical
Fin:
End Sub |
1.D. Fermeture du fichier
La fermeture du fichier texte est une étape à ne pas oublier
pour éviter les conflits en écriture sur celui-ci.
Il est primordial que le fichier soit déverrouillé à la fermeture de
votre application.
Pour cela deux méthodes ont été envisagées. Une fermeture explicite et une autre implicite.
La fermeture explicite se fera à l'aide de la méthode Fermer
de l'objet GestionnaireErreur. Celle implicite se fera à la destruction
de l'objet via la méthode Class_Terminate prédéfinie en VBA et
automatiquement invoquée par le programme lors de la destruction de l'objet.
Cette méthode implicite est impérative pour traiter le cas d'un arrêt
critique de votre application.
Pour ne pas écrire deux fois le même code, la méthode Fermer
consistera en un simple appel de la méthode Class_Terminate.
Public Sub Fermer()
Class_Terminate
End Sub
Private Sub Class_Terminate()
On Error GoTo GestionErreur
oFichierLog.Close
Set oFichierLog=Nothing
GestionErreur:
End Sub |
2. Utilisation de l'objet GestionnaireErreur dans votre application
2.A. Instanciation d'un nouvel objet au démarrage
L'instanciation de l'objet se fera via une macro dont la seule
action sera d'éxecuter du code placé dans un module.
Ajoutez un nouveau module à votre projet (un module simple, pas un module de classe),
et placez-y le code suivant :
Public oGestErreur As GestionnaireErreur
Public Function Macro_Autoexec()
Dim strLogFileName As String
strLogFileName = Left(CurrentDb.Name, Len(CurrentDb.Name) - 4) & ".log"
Set oGestErreur = New GestionnaireErreur
oGestErreur.Instancier strLogFileName
End Function |
Cette fonction instancie un nouvel objet GestionnaireErreur nommé oGestErreur.
Cet objet est public, il sera donc disponible depuis n'importe quelle procédure de votre projet.
Pour que ce code soit exécuté automatiquement au démarrage de votre
application, créez une macro nommée AutoExec (le simple fait de
lui donner ce nom fera que son lancement sera automatique dès l'
ouverture de l'application.
- Action : ExécuterCode
- Nom Fonction : Macro_Autoexec()
2.B. Utilisation dans les procédures du projet
L'utilisation est très simple. Là où vous avez mis en place une gestion d'erreurs via On Error,
il suffit de faire un appel à la méthode EnregistrerErreur de l'objet oGestErreur.
Avant :
Sub test()
On Error GoTo GestionErreur
Dim i As Integer
i = 10 / 0
GoTo Fin
GestionErreur:
Select Case err.Number
Case 11: MsgBox "Division par zéro", vbCritical
Case Else: MsgBox "Erreur inconnue", vbCritical
End Select
Fin:
End Sub |
Après :
Sub test()
On Error GoTo GestionErreur
Dim i As Integer
i = 10 / 0
GoTo Fin
GestionErreur:
Select Case err.Number
Case 11: MsgBox "Division par zéro", vbCritical
Case Else: MsgBox "Erreur inconnue", vbCritical
End Select
oGestErreur.EnregistrerErreur err.Number, err.Description, "Test()"
Fin:
End Sub |
Le fichier d'erreur ressemblera alors à :
[11/12/2005 14:57:00] Procédure : Test()-> 11:Division par zéro |
Conclusion
Cette méthode de gestion d'erreurs est quelque peu simpliste mais
constitue une bonne base pour les développeurs effectuant
leurs premiers pas sur Microsoft Access. Une historisation
beaucoup plus complète peut en être dérivée en incluant par exemple
les valeurs de certaines variables critiques de votre projet.
C'est à vous de personnaliser cette approche afin de réaliser un
traitement qui saura correspondre à vos besoins.
Je tiens à remercier Jean-Philippe Ambrosino et Olivier Lance pour leur relecture et leurs corrections.
Liens utiles
 
|