Site:  Cours VB.net  
4.3 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:

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.

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

Private Sub Button3_Click

If String.IsNullOrEmpty(TextBox1.Text) Then 'on teste si l'utilisateur a tapé quelque chose

 MsgBox("Tapez quelque chose")

Else

 If 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.

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim i As Integer

Try

    i = CType(TextBox1.Text, Integer)

Catch

    MsgBox("saisir un nombre")

End Try

End 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:

 

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.