Jusqu'à la, nous nous étions contenté d'observer que parfois, des erreurs se produisées durant
l'execution d'un programme.
Pour les résoudre, nous nous bornions à écrire et ré-écrire du code pour que quoi que fasse l'
utilisateur, l'erreur tant redoutée n'arrive jamais.
C'est une possibilité. Une autre serait de créer des routines de traitements d'erreur grace au
instructions appropriées offertes par QBasic.
Voici une erreur simple mais fréquente : la division par zéro. Elle peut arriver souvent dans
un programme. Nous allons la simuler avec ce programme :
Div = 0
PRINT "*** Le traitement des erreurs ***"
INPUT "Entrer un chiffre qui sera volontairement divisé par zéro : ", Reponse
PRINT Reponse / Div
Comme prévu, l'erreur 'Division par zéro' se produit.
C'est là qu'intervient le traitement des erreurs. Au début du code, on écrit ON ERROR GOTO
suivit d'une étiquette (un label) ou d'un numéro de ligne à partir du quel commence le traitement
des erreurs. Le petit programme corrigé (pour l'instant) donnera :
ON ERROR GOTO Traitement ' En cas d'erreur, on va à Traitement
Div = 0
PRINT "*** Le traitement des erreurs ***"
INPUT "Entrer un chiffre qui sera volontairement divisé par zéro : ", Reponse
PRINT Reponse / Div
END ' Le programme se termine désormais ici
Traitement:
RESUME ' Ne pas oublier le RESUME
RESUME sert à retourner à l'instruction fautive. Donc, on écrit RESUME à la fin de la
routine de traitement d'erreur pour retourner au programme. Si on execute ce programme tel quel,
une situation comparable à une boucle sans fin va se produire : pour en sortir, on sera obligé
d'utiliser la combinaison de touche CTRL+PAUSE. Mais au fait, pourquoi entre-t-on dans une tel
boucle ? Tout simplement parceque le denominateur (la variable Div) vaut toujours 0 !
Donc, une erreur est continuellement produite !
Pour y remédier, il y a deux façons. La première, c'est de modifier le contenu de la variable
Div avant de retourner au programme. On écrira alors par exemple :
ON ERROR GOTO Traitement ' En cas d'erreur, on va à Traitement
Div = 0
PRINT "*** Le traitement des erreurs ***"
INPUT "Entrer un chiffre qui sera volontairement divisé par zéro : ", Reponse
PRINT Reponse / Div
END ' Le programme se termine désormais ici
Traitement:
Div = Div + 1 ' Empêchement de la division par zéro
RESUME ' Ne pas oublier le RESUME
Ou alors on emploi le mot-clef NEXT à la suite de RESUME, ce qui aura pour effet de
résumer le programme à l'instruction suivant l'instruction ayant provoqué l'erreur.
Ainsi :
ON ERROR GOTO Traitement ' En cas d'erreur, on va à Traitement
Div = 0
PRINT "*** Le traitement des erreurs ***"
INPUT "Entrer un chiffre qui sera volontairement divisé par zéro : ", Reponse
PRINT Reponse / Div
END ' Le programme se termine désormais ici
Traitement:
RESUME NEXT ' On résume à l'instruction suivante
Dans ce cas de figure, le programme resume à l'instruction END. Mais on peut traiter les erreurs
au cas par cas, suivant le code d'erreur correspondant. Et oui, l'instruction ERR du QBasic
permet de connaitre le code d'erreur de la dernière erreur produite. On peut alors écrire une
routine de traitement d'erreur tel que celle-ci :
ON ERROR GOTO Traitement
Div = 0
PRINT "*** Le traitement des erreurs ***"
INPUT "Entrer un chiffre qui sera volontairement divisé par zéro : ", Reponse
PRINT Reponse / Div
END
Traitement:
SELECT CASE ERR ' ERR renvoi le code d'erreur
CASE 11 ' Code 11 : division par zéro
PRINT "Division par zéro. Allez à l'instruction suivante [O/N] ?"
DO
T$ = UCASE$(INKEY$)
LOOP UNTIL T$ = "O" OR T$ = "N"
IF T$ = "O" THEN RESUME NEXT ELSE RESUME
CASE ELSE
PRINT "!!! Erreur indéterminée !!!"
END SELECT
RESUME
Evidemment, les exemples de traitement d'erreur exposés ci-dessus n'ont aucun interets, sinon
d'expliquer le fonctionnement du traitement des erreurs. C'est à vous, suivant le cas où vous
vous trouvez d'écrire les bonnes lignes de codes.
|