Créer des rapports d'erreurs sous Access

Christophe WARIN

Ce tutoriel constitue un exemple simple et puissant destiné à faciliter le débogage et la maintenance sur site d'applications Access.

- Titre : Créer des rapports d'erreurs sous Access

- Auteur : Christophe WARIN

- Parution : 20 décembre 2005

- Licence : Copyright ® 2005 - 2010 WARIN Christophe. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 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

Ce tutoriel nécessite la connaissance des bases du langage Visual Basic et notamment la gestion des erreurs : Tutoriel sur la gestion des erreurs

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é

- oFichierLog

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
'Instancie un objet FileSystemObject
Dim oFso As New FileSystemObject
'Ouvre le fichier texte en mode ajout
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
'Récupère le nom du fichier de base de données et lui ajoute l'extension .log
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
'Enregistre l'erreur dans le fichier de log
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

La gestion des erreurs sous Visual Basic

La programmation orientée objet sous Visual Basic

Exemple de sources concernant la manipulation des fichiers texte