Rappel : Ce cours est enseigné dans la
spécialité PISE du Master MECI (Université Paris 7)
par Christophe Darmangeat

Partie 7
Compléments de code
1. La gestion des Erreurs
On sait que dans une application digne de ce nom, même lorsqu’une erreur se produit (fichier introuvable, mauvaise saisie au clavier, etc.) cette erreur ne donne pas lieu à un plantage inopiné du programme, mais qu’elle est gérée par ce programme. Cette brève section est donc consacrée aux erreurs à l’exécution, et au moyen de les prévoir (à défaut de pouvoir les empêcher).
1.1 L’objet Err
C’est là l’occasion de découvrir, après App, le deuxième objet de ce cours qui ne soit pas un contrôle : l’objet Err.
Cet objet, qui n’étant pas un contrôle, ne possède pas d’existence graphique, est utilisé par toute application pour stocker l’état des erreurs qu’elle a éventuellement provoquées. On pourra, dans le code, avoir recours à différentes propriétés de l’objet Err :
  • Number : désigne le code de cette erreur, permettant d’identifier son type
  • Description : il s'agit d'un rapide bla-bla sur la nature de l’erreur
  • Source : qui indique l’objet à l’origine de l’erreur
1.2 Gérer les erreurs
Il y a deux choses à savoir avant de pouvoir procéder :
  • Toute erreur provoque un événement appelé >Error.
  • VB impose de gérer les erreurs par une programmation non structurée. C'est une pure horreur, mais c'est comme ça, on n'y peut rien.
Il faudra donc, au début d’une procédure susceptible d’engendrer des erreurs (les mauvaises langues traduiront : "au début de chaque procédure...), taper la ligne suivante :
On Error GoTo Etiquette
Une étiquette, c’est une sorte de sous-titre à l’intérieur de la procédure, se terminant par le signe ":" (deux points).
Oui, je sais, c’est une pure horreur que d’obliger les gens à mettre des GoTo dans un joli programme structuré. Mais que voulez-vous, ici, Microsoft ne nous a pas laissé le choix. L’idée est donc que si une erreur, quelle qu’elle soit, survient au cours de cette procédure, au lieu de se planter bêtement, l’application ira gentiment rechercher l’étiquette que vous avez désignée, et exécutera son code.
Et du coup, pour éviter que le déroulement normal de la procédure n’exécute lui aussi ce qui se trouve sous l’étiquette, il faudra forcer la sortie de la procédure avant cette étiquette par l’instruction Exit Sub. Voilà ce que cela donne :
Public Sub Totoche()
On Error GoTo Oops
Tata = 12 / 0
Exit Sub
Oops:
Msgbox("Diviser par zéro, c’est pas malin !")
End Sub
Bien sûr, ici, notre gestionnaire d’erreurs est vraiment a minima. On peut faire quelque chose de beaucoup plus fin en y testant par exemple la propriété Err.Number, et en réagissant différemment selon le code (donc le type) de l’erreur qui est survenue.


2. Fonctions et Procédures personnalisées
Jusqu’ici, toutes les procédures que nous avons utilisées étaient des procédures événementielles : leur nom était régi par des règles strictes, qui spécifiaient le déclenchement de leur exécution. Mais, nous l’avons dit en introduction, , VB permet comme tout langage de créer des procédures traditionnelles, baptisées selon votre bon vouloir. Leur exécution sera alors déclenchée non par une action de l’utilisateur, mais par une instruction de votre programme. C’est donc l’équivalent VB du Gosub cher aux cœurs de certains (d'ailleurs, les nostalgiques intégristes peuvent toujours utiliser Gosub, qui est une instruction reconnue en VB).
Je rappelle que de tels appels peuvent comporter des paramètres, ou non, cela ne change rien de fondamental à l’affaire.
Un cas banal d’utilisation de cette technique est celui de l’initialisation d’une Form. Pour que cette Form soit propre, on veut que toutes les zones de textes soient vierges. Pour peu qu’on ait besoin de procéder à l’initialisation à plusieurs moments différents de notre application, au lieu de répéter à chaque fois les mêmes codes, on va créer une procédure Init() qui comportera les lignes de code nécessaires :
Private Sub Init()
Nom.Text = ""
Prénom.Text = ""
Etc.
End Sub
Pour appeler cette procédure, il suffira ensuite de passer l’instruction suivante :
Call Init
Et le tour est joué. Quelques éléments supplémentaires toutefois :
  • Attention à la portée des procédures. Une procédure Private n’est disponible que  si l’appel se situe dans la Form qui la contient. Pour qu’une procédure puisse être appelée de n’importe quelle Form, il faut qu’elle porte comme nom Public. Dans ce cas, lors de l'appel, la procédure désignée doit être désignée comme faisant partie d'une autre Form. Si l'on souhaite appeler dans Form1 une procédure appelée Truc est qui est déclarée dans Form2, il faudra écrire :
    Call Form2.Truc
    Au passage, j'en profite pour signaler que cette règle vaut pour désigner n'importe quel objet qui ne se trouve pas sur la Form à partir de laquelle on le désigne.
  • Si l'on veut passer des paramètres à une procédure, on aura recours à deux instructions : ByVal pour le passage par valeur(paramètre en entrée), et ByRef pour le passage par référence. La déclaration d'une procédure Toto avec un paramètre numérique X en entrée et un paramètre Y en sortie donnera ainsi :
    Private Sub Toto(ByVal X as Integer, ByRef Y as Integer)
    Pour déclarer une Fonction, on aura recours aux instructions Function et End Function. Voici une fonction pas très utile, qui retourne bêtement le carré d'un nombre :
    Private Function Carre(X as Double)
    Carre = X * X
    End Function


3. Procédure de démarrage
Lors du lancement de l’application (du projet), VB a besoin de savoir quelle procédure (ou quelle Form), est la procédure (la Form) par défaut. Si vous ne touchez à rien, il s’agit toujours de la première Form qui a été créée dans le projet. Mais en cas de copier-coller sauvages de Forms , VB peut finir par se mélanger  les pédales et ne plus savoir par où votre application est censée commencer. Il vous envoie alors un magnifique message d'erreur, le très classique :

Si vous souhaitez changer de Form par défaut, ou la redéfinir en cas d'erreur, ou si vous souhaitez lancer le projet par une procédure principale indépendante de toute Form, cela se passe dans le menu Projet – Propriétés. Vous y choisissez de lancer l’application :
  • Soit en redéfinissant la Form par défaut
  • Soit en désignant une procédure principale, qui devra obligatoirement se trouver dans un module et s’appeler Sub Main()