|
Site |
Cours VB.net |
|
|
|
Traiter les erreurs. |
|
|
Il y a plusieurs types d'erreurs.
Les erreurs de syntaxe.
Les erreurs d'exécution.
Les erreurs de logique.
Voir la vidéo au
format 'Flash':
ou au format AVI
en
Visual Basic 2005
Les erreurs de syntaxe:
Elle surviennent en mode conception quand on tape le code:
Exemples:
A+1=B 'Erreur dans l'affectation
f.ShowDialogue 'Faute de frappe, il fallait taper ShowDialog
2 For... et un seul Next
Dim i As Integer: Label.Text= i 'Affectation d'un Integer à une propriété text qui attend une String.
....
Dans ces cas VB souligne en ondulé bleue le code. Il faut mettre le curseur sur le mot souligné, l'explication de l'erreur apparaît.
Exemple: Propriété Text d'un label mal orthographiée:
![]()
Il faut les corriger immédiatement en tapant le bon code (ici 'Text').
En bas il y a aussi une fenêtre; "liste des erreurs":
Elle affiche tous les problèmes; pour atteindre le code correspondant à une de ces erreurs, double-cliquez sur une des lignes de la liste.
En VB 2005 un panneau d'exclamation permet d'ouvrir une fenêtre proposant le moyen de corriger l'erreur:
Ici on met dans la propriété text d'un label un Integer, alors qu'il faut mettre une String (Option Strict est probablement égal à On); Vb montre la correction : CStr(i) converti i en String.
Si vous exécuter le programme dans l'IDE alors qu' il y a un problème , VB demande si on veut exécuter la dernière génération réussie:
Si vous tapez 'oui' VB exécute la dernière version qui a été générée correctement, mais PAS de code source actuel qui contient des erreurs!!
Les erreurs d'exécution:
Elle surviennent en mode Run ou lors de l'utilisation de l'exécutable:
une instruction ne peut pas être effectuée.
Quand on utilise l'exécutable:Le logiciel s'arrête brutalement, c'est très gênant!!
Pour l'utilisateur c'est un 'BUG'
Il y a levée d'une exception, voila ce que cela donne dans l'IDE:
Exemple: je tente d'accéder à un élément d'un tableau qui n'existe pas (l'indice est trop grand cela entraîne une exception 'OutOfRange').
Le logiciel s'arrête, l'instruction qui a planté apparaît en jaune et VB donne une explication.
L'erreur est:
Soit une erreur de conception.
Exemple:
Ouvrir un fichier qui n'existe pas (On aurait du vérifier qu'il existe avant de l'ouvrir!).
Division par zéro.
Utiliser un index d'élément de tableau supérieur au nombre d'élément:
Envoyer un mauvais paramètre à une fonction.
Soit une erreur de l'utilisateur.
Exemple: On lui demande de taper un chiffre, il tape une lettre ou rien puis valide.
Il faut toujours vérifier ce que fait l'utilisateur et prévoir toutes les possibilités.
Exemple: si je demande à l'utilisateur de tapez un nombre entre 1 et 10, il faut:
Vérifier qu'il a tapé quelque chose.
Que c'est bien un chiffre (pas des lettres).
Que le chiffre est bien entre 1 et 10.
Sinon il faudra reposer la question.
A-Capter les erreurs avec Try Catch Finally:
Avant l'instruction supposée provoquer une erreur indiquez: Essayer (Try), si une erreur se produit Intercepter l'erreur (Catch) puis poursuivre (après Finally)
Try
Instruction susceptible de provoquer une erreur.
Catch
Traitement de l'erreur
Finally
Code toujours exécuté
End Try
Il faut pour que cela fonctionne avoir tapé au préalable Imports System.IO
Il est possible d'utiliser Catch pour récupérer l'objet 'Exception' qui est généré par l'erreur.
Catch ex As Exception
Cet objet Exception à des propriétés:
Message qui contient le descriptif de l'erreur.
Source qui contient l'objet qui a provoqué l'erreur....
ex.Message contient donc le message de l'erreur.
Cet objet Exception ( de l'espace IO) à aussi des classes dérivées: StackOverFlowException; FileNotFoundExeption; EndOfStreamExeption; FileLoadExeption; PathTooLongExeption. Enfin une exception peut provenir de l'espace System: ArgumentExceptions; ArithmeticException; DivideByZeroExeception.....
Il est possible d'écrire plusieurs instructions Catch avec pour chacune le type de l'erreur à intercepter. (Faisant partie de la classe Exceptions)
Exemple:
On ouvre un fichier par StreamReader , comment intercepter les exceptions suivantes?
Répertoire non valide
Fichier non valide
Autre.
Try
sr= New StreamerReader (NomFichier)
Catch ex As DirectoryNotFoundException
MsgBox("Répertoire invalide")
Catch ex As FileNotFoundException
MsgBox("Fichier invalide")
Catch ex As Exception
MsgBox(ex.Message)
End Try
Noter que le dernier Catch intercepte toutes les autres exceptions.
On peut encore affiner la gestion par le mot clé When qui permet une condition.
Catch ex As FileNotFoundException
When ex.Message.IndexOf ("Mon Fichier.txt") >0
MsgBox ("Impossible d'ouvrir Mon Fichier.txt")
Si le texte "Mon Fichier.txt" est dans le message, affichez que c'est lui qui ne peut pas être ouvert.
Exit Try permet de sortir prématurément.
B-Capter les erreurs avec On error :
On peut aussi utiliser la méthode Visual Basic:
On Error Goto permet en cas d'erreur de sauter à une portion de code traitant l'erreur.
On peut lire le numéro de l'erreur qui s'est produite, ce numéro est dans Err.Number.
Err.Description contient le texte décrivant l'erreur. Err.Source donne le nom de l'objet ou de l'application qui a crée l'erreur.
Quand l'erreur est corrigée, on peut revenir de nouveau à la ligne qui a provoqué l'erreur grâce à Resume ou poursuivre à la ligne suivante grâce à Resume Next
Exemple:
On Error GoTo RoutinedErreur 'Si une erreur se
produit se rendre à 'RoutineErreur'
Dim x As Integer = 33
Dim y As Integer = 0
Dim z As Integer
z = x / y ' Crée une division par 0 !!
RoutinedErreur: ' La Routine d'erreur est ici (remarquer ':').
Select Case Err.Number ' On regarde le numéro de l'erreur.
Case 6 ' Cas : Division par zéro interdite
y = 1 ' corrige l'erreur.
Case Else
' autres erreurs....
End Select
Resume ' Retour à la ligne qui a provoqué l'erreur.
Pour arrêter la gestion des erreurs il faut utiliser:
On Error Goto 0
Parfois on utilise une gestion hyper simplifiée des erreurs:
Si une instruction 'plante', la sauter et passez à l'instruction suivante, pour cela on utilise:
On Error Resume Next
Exemple: On veut effacer un fichier
On Error Resume Next
Kill (MonFichier)
On Error goto 0
Ainsi , si le fichier n'existe pas , cela ne plante pas (on aurait pu aussi vérifier qu'il existe avant de l'effacer).
On Error Gosub n'existe plus.
On Error est moins performant que Try
Catch et surtout il ralentit le code+++: si nécessaire utiliser Try Catch.
En résumé: pour éviter les erreurs d'exécution il est donc possible:
- D'écrire du code gérant le problème, contrôlant les actions de l'utilisateur..
Exemple: on demande à l'utilisateur de saisir un nombre dans TextBox1 puis de cliquez sur Button3
Si l'utilisateur a tapé une lettre au lieu d'un chiffre, le prévenir
'on teste si l'utilisateur a tapé quelque chosePrivate Sub Button3_Click
If String.IsNullOrEmpty(TextBox1.Text) Then
MsgBox("Tapez quelque chose"
) ElseIf Not IsNumeric(TextBox1.Text) Then 'on teste si l'utilisateur a tapé du numérique
MsgBox("Tapez un chiffre")
End If
End If
End Sub
- Une autre alternative est de capter l'erreur.
Exemple: on demande à l'utilisateur de saisir un nombre dans TextBox1 puis de cliquez sur Button3
On converti le texte tapé en Integer, on sait que si la conversion est impossible (pas de texte tapé ou texte non numérique) une exception invalidCastException sera levée et le programme 'plantera'. On écrit donc avant l'instruction Ctype un Try pour capter l'erreur:
Tester s'il y a une erreur, s'il y a erreur, la capter.
Button3.Click Dim i As Integer TryPrivate Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
i = CType(TextBox1.Text, Integer
)Catch
MsgBox("saisir un nombre"
) End TryEnd Sub
Les erreurs de logique:
Le programme fonctionne, pas d'erreurs apparentes, mais les résultats sont erronés, faux.
Il faut faire des tests dans les conditions réelles avec des données courantes, mais aussi avec des données remarquables (limites supérieures, inférieures, cas particuliers..) pour voir si les résultats sont cohérents et exacts.
Une fois l'erreur trouvée, il faut en déterminer la cause et la corriger.
Ou bien elle est évidente à la lecture du code ou bien elle n'est pas évidente et c'est l'horreur.
Dans ce dernier cas il faut analyser le fonctionnement du programme pas à pas, instruction par instruction en surveillant la valeur des variables.(voir la rubrique déboguage )
Les erreurs les plus communes sont:
Utilisation d'un mauvais nom de variable (La déclaration obligatoire des variables évite cela)
Erreur dans la portée d'une variable.
Erreur dans le passage de paramètres (Attention au By Val et By Ref)
Erreur dans la conception de l'algorithme.
...
Quelques règles permettent de les éviter: voir Règles de bonne programmation.
Les Tests:
Il faut donc toujours tester le fonctionnement du programme de multiples fois:
On fera des:
Tests unitaires: qui testerons les procédures, les classes une à une sans tester la totalité du programme.
Tests de composants et d'intégration: qui testeront plusieurs procédures ou classes fonctionnant ensemble.
Tests de régression: c'est la répétition des test précédents afin de voir si une modification ou un ajout n'entraîne pas de nouvelles erreurs qui n'existaient pas.
Tests système: test sur le logiciel dans sa version finale.
Les tests détecterons les erreurs, le déboguage permettra de trouver la cause et de corriger l'erreur.
Il faut avoir une armée de
Bêta-testeurs.
|
|
|
|
|