Contourné dépassement de capacité

cs_mathben Messages postés 30 Date d'inscription vendredi 18 novembre 2005 Statut Membre Dernière intervention 10 décembre 2006 - 2 nov. 2006 à 18:42
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 3 nov. 2006 à 00:09
Bonjour, j'ai fait un beau programme, je demande a mon ami de trouver tous les bogues, il écrit le nombre 99999999999999999999999999999999999999999999999999999999999999999, bien, mon programme va boguer.
c'est une application windows.  Vous savez comment je peux faire pour le contourné, si il est en string, il ne peut pas déterner si le nombre est trop gros, à moi que je détermine le nombre maximum de lettre qu'il met (il met des chiffres, suposé, j'ai fait une vérification avec un isnumeric).
je met mes valeurs en integer, car mon programme, si on rentre 10 000, il va prendre du temps avant de finir, essayer le ^^
Le voici
<hr size="2" width="100%" />Module formatif10no15
    'Ce programme nous montre la formule de pythagore avec des nombres entiers
    Sub Main()
        Dim num1 As Integer, num2 As Integer, num3 As Integer, maxNum1 As Integer _
        , nbResultatVrai As Integer, nbResultatFaux As Integer, nbResultatTotale As Integer _
        , pourcentage As Byte, pourcentageAvant As Byte
        Dim doitRecommencerTexte As String, maxNum1Texte As String, reponse As String _
        , affichageNumberTexte As String, nbRaccourciTexte As String
        Dim doitRecommencer As Boolean, doitAfficherSiVrai As Boolean _
        , doitAfficherTout As Boolean, doitAfficherPourcentage As Boolean _
        , nbRaccourci As Boolean, doitAfficherSiFaux As Boolean
        Console.WriteLine("Bonjour, ce programme vous permettera de calculer le nombre de solution")
        Console.WriteLine("possible de triplets du thérorême de pythagore.")
        Do
            'mettre les valeurs à zéro
            maxNum1 = 0
            num1 = 0
            num2 = 0
            num3 = 0
            nbResultatVrai = 0
            nbResultatFaux = 0
            nbResultatTotale = 0
            pourcentage = 0
            pourcentageAvant = 0
            maxNum1Texte = ""
            doitRecommencerTexte = ""
            affichageNumberTexte = ""
            reponse = ""
            nbRaccourciTexte = ""
            doitRecommencer = False
            doitAfficherSiVrai = False
            doitAfficherTout = False
            doitAfficherPourcentage = False
            nbRaccourci = False
            doitAfficherSiFaux = False
            'entrer de variable
            'entrer de la limite
            Console.WriteLine()

            If doitRecommencer = False Then
                Console.WriteLine("Veuillez entrer la limite de triplets que vous désirez.")
                Console.Write(">")
                maxNum1Texte = Console.ReadLine()
                maxNum1Texte = maxNum1Texte.ToLower

                If maxNum1Texte = "retry" Then
                    doitRecommencer = True
                End If

                'affichage si il y a une erreur

                Do While Not IsNumeric(maxNum1Texte) And doitRecommencer = False
                    Console.WriteLine()
                    Console.WriteLine("Vous vous êtes trompés.  Veuillez recommencer.")
                    Console.WriteLine()
                    Console.WriteLine("Veuillez entrer la limite de triplets que vous désirez.")
                    Console.Write(">")
                    maxNum1Texte = Console.ReadLine()
                    maxNum1Texte = maxNum1Texte.ToLower()

                    If maxNum1Texte = "retry" Then
                        doitRecommencer = True
                    End If

                Loop

                'copier la valeur dans une valeur numérique

                If doitRecommencer = False Then
                    maxNum1 = CInt(maxNum1Texte)
                End If

                'exception si l'utilisateur va en bas de zéro, on recommence le programme

                If maxNum1 < 0 Then
                    Console.WriteLine()
                    Console.WriteLine("Vous devez mettre un nombre positif.")
                    Console.WriteLine("Recommencer")
                    Console.Write(">")
                    doitRecommencer = True
                End If

            End If

            'entrer de l'option de l'affichage

            If doitRecommencer = False Then
                Console.WriteLine("Voulez-vous afficher juste les vrai, les faux, tout ou en pourcentage?")
                Console.WriteLine(".....1. afficher les vrai")
                Console.WriteLine(".....2. afficher les faux")
                Console.WriteLine(".....3. afficher tout")
                Console.WriteLine(".....4. afficher pourcentage")
                Console.Write(">")
                affichageNumberTexte = Console.ReadLine()
                affichageNumberTexte = affichageNumberTexte.ToLower()

                If affichageNumberTexte = "retry" Then
                    doitRecommencer = True
                End If

            End If

            'affichage si il y a une erreur

            Do While doitRecommencer = False And affichageNumberTexte <> "1" And affichageNumberTexte <> "2" And _
            affichageNumberTexte <> "3" And affichageNumberTexte <> "4"
                Console.WriteLine()
                Console.WriteLine("Vous vous êtes trompés.  Veuillez recommencer.")
                Console.WriteLine()
                Console.WriteLine("Voulez-vous afficher juste les vrai, les faux, tout ou en pourcentage?")
                Console.WriteLine(".....1. afficher les vrai")
                Console.WriteLine(".....2. afficher les faux")
                Console.WriteLine(".....3. afficher tout")
                Console.WriteLine(".....4. afficher pourcentage")
                Console.Write(">")
                affichageNumberTexte = Console.ReadLine()
                affichageNumberTexte = affichageNumberTexte.ToLower()

                If affichageNumberTexte = "retry" Then
                    doitRecommencer = True
                End If

            Loop

            'selection de la forme de l'affichage

            If doitRecommencer = False Then

                Select Case affichageNumberTexte
                    Case "1"
                        doitAfficherSiVrai = True
                    Case "2"
                        doitAfficherSiFaux = True
                    Case "3"
                        doitAfficherTout = True
                    Case "4"
                        doitAfficherPourcentage = True
                End Select

            End If

            'entrer le raccourci (du programme) pour qu'il enlève les doubles

            If doitRecommencer = False Then
                Console.WriteLine("Voulez-vous enlever les doubles? (le programme s'exécute plus vite)")
                Console.WriteLine(".....1.oui")
                Console.WriteLine(".....2.non")
                nbRaccourciTexte = Console.ReadLine()
                nbRaccourciTexte = nbRaccourciTexte.ToLower()

                If nbRaccourciTexte = "retry" Then
                    doitRecommencer = True
                End If

                'si il a une erreur

                Do While doitRecommencer = False And nbRaccourciTexte <> "oui" And nbRaccourciTexte <> "non" And _
                nbRaccourciTexte <> "0" And nbRaccourciTexte <> "1" And nbRaccourciTexte <> "2" And nbRaccourciTexte <> "no" And _
                    nbRaccourciTexte <> "yes" And nbRaccourciTexte <> "n" And nbRaccourciTexte <> "y"
                    Console.WriteLine("Vous vous êtes trompés.  Voulez-vous enlever les doubles?")
                    Console.WriteLine(".....1.oui")
                    Console.WriteLine(".....2.non")
                    nbRaccourciTexte = Console.ReadLine()
                    nbRaccourciTexte = nbRaccourciTexte.ToLower

                    If nbRaccourciTexte = "retry" Then
                        doitRecommencer = True
                    End If

                Loop

                'affirmation
                If nbRaccourciTexte "oui" Or nbRaccourciTexte "yes" Or nbRaccourciTexte = "y" Or _
                nbRaccourciTexte = "1" Then
                    nbRaccourci = True                ElseIf nbRaccourciTexte "non" Or nbRaccourciTexte "no" Or nbRaccourciTexte = "n" Or _                nbRaccourciTexte "2" Or nbRaccourciTexte "0" Then
                    nbRaccourci = False
                End If

            End If

            'exécution du programme avec affichage vrai et raccourci = faux

            If doitRecommencer = False Then
                If doitAfficherSiVrai True And nbRaccourci False Then

                    For num1 = 1 To maxNum1
                        For num2 = 1 To maxNum1
                            For num3 = 1 To maxNum1
                                'triage des résultats -> les vrai et les faux
                                If (num1 * num1) + (num2 * num2) = (num3 * num3) Then
                                    reponse = "vrai"
                                    nbResultatVrai = nbResultatVrai + 1
                                    Console.WriteLine("(" & num1 & ")²" & " + " & "(" & num2 & ")²" & " = " & "(" & num3 & ")²" & "   est " & reponse)
                                Else
                                    reponse = "faux"
                                    nbResultatFaux = nbResultatFaux + 1
                                End If
                            Next num3
                        Next num2
                    Next num1
                    'exécution du programme avec affichage vrai et raccourci = vrai                ElseIf doitAfficherSiVrai True And nbRaccourci True Then
                    For num1 = 1 To maxNum1
                        For num2 = num1 To maxNum1
                            For num3 = num2 To maxNum1
                                'triage des résultats -> les vrai et les faux
                                If (num1 * num1) + (num2 * num2) = (num3 * num3) Then
                                    reponse = "vrai"
                                    nbResultatVrai = nbResultatVrai + 1
                                    Console.WriteLine("(" & num1 & ")²" & " + " & "(" & num2 & ")²" & " = " & "(" & num3 & ")²" & "   est " & reponse)
                                Else
                                    reponse = "faux"
                                    nbResultatFaux = nbResultatFaux + 1
                                End If
                            Next num3
                        Next num2
                    Next num1
                    'exécution du programme avec affichage faux et raccourci = faux                ElseIf doitAfficherSiFaux True And nbRaccourci False Then
                    For num1 = 1 To maxNum1
                        For num2 = 1 To maxNum1
                            For num3 = 1 To maxNum1
                                'triage des résultats -> les vrai et les faux
                                If (num1 * num1) + (num2 * num2) = (num3 * num3) Then
                                    reponse = "vrai"
                                    nbResultatVrai = nbResultatVrai + 1
                                Else
                                    reponse = "faux"
                                    nbResultatFaux = nbResultatFaux + 1
                                    Console.WriteLine("(" & num1 & ")²" & " + " & "(" & num2 & ")²" & " = " & "(" & num3 & ")²" & "   est " & reponse)
                                End If
                            Next num3
                        Next num2
                    Next num1
                    'exécution du programme avec affichage faux et raccourci = vrai                ElseIf doitAfficherSiFaux True And nbRaccourci True Then
                    For num1 = 1 To maxNum1
                        For num2 = num1 To maxNum1
                            For num3 = num2 To maxNum1
                                'triage des résultats -> les vrai et les faux
                                If (num1 * num1) + (num2 * num2) = (num3 * num3) Then
                                    reponse = "vrai"
                                    nbResultatVrai = nbResultatVrai + 1
                                Else
                                    reponse = "faux"
                                    nbResultatFaux = nbResultatFaux + 1
                                    Console.WriteLine("(" & num1 & ")²" & " + " & "(" & num2 & ")²" & " = " & "(" & num3 & ")²" & "   est " & reponse)
                                End If
                            Next num3
                        Next num2
                    Next num1
                    'exécution du programme avec affichage tout et raccourci = faux                ElseIf doitAfficherTout True And nbRaccourci False Then
                    For num1 = 1 To maxNum1
                        For num2 = 1 To maxNum1
                            For num3 = 1 To maxNum1
                                'triage des résultats -> les vrai et les faux
                                If (num1 * num1) + (num2 * num2) = (num3 * num3) Then
                                    reponse = "vrai"
                                    nbResultatVrai = nbResultatVrai + 1
                                Else
                                    reponse = "faux"
                                    nbResultatFaux = nbResultatFaux + 1
                                End If
                                'affichage du texte
                                Console.WriteLine("(" & num1 & ")²" & " + " & "(" & num2 & ")²" & " = " & "(" & num3 & ")²" & "   est " & reponse)
                            Next num3
                        Next num2
                    Next num1
                    'exécution du programme avec affichage tout et raccourci = vrai                ElseIf doitAfficherTout True And nbRaccourci True Then
                    For num1 = 1 To maxNum1
                        For num2 = num1 To maxNum1
                            For num3 = num2 To maxNum1
                                'triage des résultats -> les vrai et les faux
                                If (num1 * num1) + (num2 * num2) = (num3 * num3) Then
                                    reponse = "vrai"
                                    nbResultatVrai = nbResultatVrai + 1
                                Else
                                    reponse = "faux"
                                    nbResultatFaux = nbResultatFaux + 1
                                End If
                                'affichage du texte
                                Console.WriteLine("(" & num1 & ")²" & " + " & "(" & num2 & ")²" & " = " & "(" & num3 & ")²" & "   est " & reponse)
                            Next num3
                        Next num2
                    Next num1
                    'exécution du programme avec pourcentage et raccourci = faux                ElseIf doitAfficherPourcentage True And nbRaccourci False Then
                    For num1 = 1 To maxNum1
                        For num2 = 1 To maxNum1
                            For num3 = 1 To maxNum1
                                'triage des résultats -> les vrai et les faux
                                If (num1 * num1) + (num2 * num2) = (num3 * num3) Then
                                    nbResultatVrai = nbResultatVrai + 1
                                Else
                                    nbResultatFaux = nbResultatFaux + 1
                                End If
                            Next num3
                        Next num2
                        doitAfficherPourcentage = True
                        pourcentageAvant = pourcentage
                        pourcentage = CByte(num1 / maxNum1 * 100)
                        If pourcentageAvant <> pourcentage Then
                            Console.WriteLine(pourcentage & "%")
                        End If
                    Next num1
                    'exécution du programme avec pourcentage et raccourci = faux                ElseIf doitAfficherPourcentage True And nbRaccourci True Then
                    For num1 = 1 To maxNum1
                        For num2 = num1 To maxNum1
                            For num3 = num2 To maxNum1
                                'triage des résultats -> les vrai et les faux
                                If (num1 * num1) + (num2 * num2) = (num3 * num3) Then
                                    nbResultatVrai = nbResultatVrai + 1
                                Else
                                    nbResultatFaux = nbResultatFaux + 1
                                End If
                            Next num3
                        Next num2
                        doitAfficherPourcentage = True
                        pourcentageAvant = pourcentage
                        pourcentage = CByte(num1 / maxNum1 * 100)
                        If pourcentageAvant <> pourcentage Then
                            Console.WriteLine(pourcentage & "%")
                        End If
                    Next num1
                End If
            End If

            'fin de l'application
            'analyse des résultats

            If doitRecommencer = False Then
                nbResultatTotale = nbResultatVrai + nbResultatFaux
                Console.WriteLine()
                Console.WriteLine("Il y a " & nbResultatVrai & " résultats vrai et " & nbResultatFaux & " resultats faux sur " & nbResultatTotale & " résultats.")
                Console.WriteLine()
            End If

            'demande si l'utilisateur doit recommencer

            If doitRecommencer = False Then
                Console.WriteLine("Voulez-vous recommencer?")
                Console.WriteLine(".....1.oui")
                Console.WriteLine(".....2.non")
                doitRecommencerTexte = Console.ReadLine
                doitRecommencerTexte = doitRecommencerTexte.ToLower()

                Do While doitRecommencerTexte <> "oui" And doitRecommencerTexte <> "non" And doitRecommencerTexte <> "0" And _
                doitRecommencerTexte <> "1" And doitRecommencerTexte <> "2" And doitRecommencerTexte <> "no" And _
                doitRecommencerTexte <> "yes" And doitRecommencerTexte <> "n" And doitRecommencerTexte <> "y"
                    Console.WriteLine("Vous vous êtes trompés.  Voulez-vous recommencer?")
                    Console.WriteLine(".....1.oui")
                    Console.WriteLine(".....2.non")
                    doitRecommencerTexte = Console.ReadLine()
                    doitRecommencerTexte = doitRecommencerTexte.ToLower
                Loop
                If doitRecommencerTexte "oui" Or doitRecommencerTexte "yes" Or doitRecommencerTexte = "y" Or _
                doitRecommencerTexte = "1" Then
                    doitRecommencer = True                ElseIf doitRecommencerTexte "non" Or doitRecommencerTexte "no" Or doitRecommencerTexte = "n" Or _                doitRecommencerTexte "2" Or doitRecommencerTexte "0" Then
                    doitRecommencer = False
                End If
            End If
        Loop While doitRecommencer = True
    End Sub

End Module
<hr size="2" width="100%" />merci

3 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
2 nov. 2006 à 19:31
en effet, c'est un beau programme comme tu le dit, avec une belle compléxité en n^4, une très belle duplication de code...

Enfin bref, pour ton problème de grand nombre, utilise un cast tout simplement :

CInt(valeur entrée)

Ca te provoquera une erreur que tu n'aura plus qu'à intercepter avec un on error goto...
0
cs_mathben Messages postés 30 Date d'inscription vendredi 18 novembre 2005 Statut Membre Dernière intervention 10 décembre 2006
2 nov. 2006 à 23:35
comment je peux utiliser cette option?
on error goto
ça fonctionne comment?
merci
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
3 nov. 2006 à 00:09
Beh faut chercher...

F1 ne fonctionne pas ?

Création d'un gestionnaire
d'erreurs
<object id= "alink_1" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>

Un gestionnaire d'erreurs est une routine de récupération et de
réaction aux erreurs de votre application. Vous ajouterez des gestionnaires
d'erreurs aux procédures susceptibles d'engendrer une erreur (vous devez partir
du principe que n'importe quelle instruction Basic peut engendrer une erreur, à moins que vous
sachiez explicitement que ce n'est pas le cas). Le processus de création d'un
gestionnaire d'erreurs comporte trois étapes :

<ol><li>Définir (ou activer) une récupération d'erreurs en indiquant à
l'application où effectuer le branchement en cas d'erreur ; autrement dit,
quelle routine de gestion d'erreurs s'exécutera.
L'instruction On Error valide la récupération d'erreurs et signale à
l'application l'étiquette qui marque le début de la routine de gestion d'erreurs.

Dans l'exemple d'application Errors.vpb, la fonction FileExists
contient une routine de gestion d'erreurs nommée
CheckError
.

</li><li>Écrire une routine de gestion d'erreurs qui réagit à toutes les erreurs que vous
pouvez anticiper. Si le contrôle effectue un branchement vers la récupération
d'erreurs, celle-ci est alors dite active.
La routine
CheckError
traite l'erreur au moyen d'une
instruction If...Then...Else qui réagit selon la valeur de la propriété Number
de l'objet Err. Il s'agit d'un code numérique correspondant à une erreur Visual Basic. Dans
l'exemple, en présence de l'erreur « Disque non prêt », un message demande à
l'utilisateur de refermer le volet du lecteur. Dans le cas de l'erreur
« Périphérique non disponible », c'est un autre message qui s'affiche. Si une
erreur différente
se produit, un message approprié s'affiche et le programme s'arrête.

</li><li>Quitter la routine de gestion d'erreurs.
Si l'erreur « Disque non prêt » survient, l'instruction Resume est
utilisée pour revenir à l'instruction où l'erreur s'est produite. Visual Basic
tente alors d'exécuter de nouveau cette instruction. Si la situation n'a pas
changé, une autre erreur se produit et l'exécution reprend alors au niveau de
la routine de gestion d'erreurs.

Dans le cas de l'erreur « Périphérique non disponible »,
l'instruction Resume Next fait brancher le code sur l'instruction suivant celle
où s'est produite l'erreur.

</li></ol>La suite de cette section est consacrée à l'explication de ces différentes
étapes qui sont d'ailleurs illustrées par l'exemple de la fonction
FileExists.

Définition de la récupération d'erreurs
La récupération d'erreurs est validée lorsque Visual Basic exécute
l'instruction On Error, laquelle désigne un gestionnaire d'erreurs. La
récupération d'erreurs demeure validée aussi longtemps que la procédure dans
laquelle elle figure demeure active, autrement dit jusqu'à ce qu'une instruction
Exit Sub, Exit Function, Exit Property, End Sub, End Function ou End Property
soit exécutée pour cette procédure. Bien qu'il ne soit possible de valider
qu'une seule récupération d'erreurs à la fois au sein d'une procédure donnée,
vous pouvez créer plusieurs récupérations d'erreurs et les valider
successivement à différents moments. Il est également possible de désactiver la
récupération d'erreurs à l'aide d'un cas spécial de l'instruction On Error, à
savoir On Error GoTo 0.

Pour définir une récupération d'erreurs permettant d'accéder à une routine de
gestion d'erreurs,
utilisez une instruction On Error GoTo line dans laquelle line
indique l'étiquette d'identification du code de gestion d'erreurs. Dans
l'exemple de la fonction FileExists, l'étiquette est
CheckError
.
(Bien que le signe deux-points appartienne à l'étiquette, il n'est pas utilisé
dans l'instruction On Error GoTo line.)

Pour plus d'informations    sur la désactivation de la gestion d'erreurs,
reportez-vous à la section « Désactivation de la gestion d'erreurs », plus
loin dans ce chapitre.

Écriture d'une routine de gestion d'erreurs
La première étape dans l'écriture d'une routine de gestion d'erreurs
consiste à ajouter une étiquette de ligne destinée à marquer le début de la
routine. Cette étiquette doit posséder un nom évocateur et être suivie du signe
deux-points. Par convention, le code de gestion d'erreurs est généralement placé à la fin de la
procédure en incluant une instruction Exit Sub, Exit Function ou Exit Property
juste avant l'étiquette de ligne, permettant ainsi à la procédure de ne pas
exécuter le code de gestion d'erreurs en l'absence d'erreur.

En son sein, la routine de gestion d'erreurs contient le code qui est effectivement
chargé de gérer l'erreur, généralement sous la forme d'une instruction Case ou
If…Then…Else. Vous devez déterminer les erreurs probables et prévoir l'action à
exécuter en réaction à chacune d'elles, notamment inviter l'utilisateur à
insérer une disquette s'il s'agit d'une erreur « Disque non prêt ». Vous devez toujours prévoir la
possibilité de gérer des erreurs inattendues à l'aide de la clause Else ou Case
Else. Dans le cas de l'exemple de la fonction FileExists, cette option avertit
l'utilisateur, puis ferme l'application.

La propriété Number de l'objet Err contient un code numérique qui représente
l'erreur d'exécution la plus récente. Il est possible d'utiliser l'objet Err
conjointement avec l'instruction Select Case ou If...Then...Else afin de prendre
des mesures spécifiques en présence de toute erreur susceptible de se
produire.

Note   La chaîne contenue dans la propriété
Description de l'objet Err explique l'erreur associée au numéro d'erreur en
cours. Cependant, la formulation de la description peut varier selon la version
de Microsoft Visual Basic. Utilisez donc
Err.Number
, plutôt que
Err.Description
, pour identifier l'erreur spécifique qui s'est
produite.

Sortie d'une routine de gestion d'erreurs
L'exemple de la fonction FileExists utilise l'instruction Resume au sein du
gestionnaire d'erreurs pour exécuter de nouveau l'instruction initialement
responsable de l'erreur, et l'instruction Resume Next pour reprendre l'exécution
au niveau de l'instruction qui suit celle où l'erreur s'est produite. Il existe
cependant d'autres moyens de sortir d'une telle routine. Selon les
circonstances, vous pouvez recourir à l'une des instructions reprises dans le
tableau suivant.

Instruction, Description, ----
Resume [0], Reprend l'exécution du programme à partir de l'instruction qui a
engendré l'erreur ou à partir du dernier appel exécuté depuis la procédure
contenant la routine de gestion d'erreurs. Utilisez cette instruction pour répéter
une opération, une fois que vous avez corrigé la condition qui a engendré
l'erreur., ----
Resume Next, Reprend l'exécution du programme à partir de l'instruction qui
suit immédiatement celle qui a provoqué l'erreur. Si l'erreur s'est produite en
dehors de la procédure qui contient la routine de gestion d'erreurs,
l'exécution reprend à partir de l'instruction qui suit immédiatement l'appel de
la procédure dans laquelle l'erreur s'est produite, pour autant que la procédure
appelée ne contienne pas de gestionnaire d'erreurs activé., ----
Resume line, Reprend l'exécution du programme à partir de l'étiquette
spécifiée par line, où line est une étiquette de ligne (ou un
numéro de ligne différent de zéro) qui se trouve forcément dans la même
procédure que le gestionnaire d'erreurs., ----
Err.Raise Number: = number, Déclenche une erreur d'exécution. Lorsque cette instruction est exécutée
au sein de la routine de gestion d'erreurs, Visual Basic cherche dans la liste des
appels une autre routine de gestion d'erreurs. (La liste des appels consiste en
une chaîne de procédures invoquées pour arriver au point en cours de
l'exécution. Pour plus d'informations, reportez-vous à la section « Ordre de
gestion
d'erreurs », plus loin dans ce chapitre.)

Différence entre les instructions Resume et Resume Next
La différence entre les instructions Resume et Resume Next est illustrée à la
figure 13.1.

Figure 13.1   Déroulement du programme avec les instructions
Resume et Resume Next

Vous utilisez généralement l'instruction Resume lorsque le gestionnaire
d'erreurs peut corriger une erreur et l'instruction Resume Next dans le cas contraire.
Vous pouvez cependant écrire un gestionnaire d'erreurs qui ne révèle pas à
l'utilisateur l'existence d'une erreur d'exécution ou qui affiche des messages d'erreur
tout en permettant à l'utilisateur de saisir des corrections.

Dans l'exemple de code suivant, la fonction Divide utilise la gestion d'erreurs pour
effectuer « en toute sécurité » une division portant sur ses arguments sans
révéler les erreurs éventuelles. Le tableau suivant dresse la liste des erreurs
qui peuvent survenir lors d'une division :

Erreur, Cause, ----
« Division par zéro », Numérateur différent de zéro, mais dénominateur égal à
zéro., ----
« Dépassement de capacité », Numérateur et dénominateur ont pour valeur zéro (pour une
division en virgule flottante)., ----
« Appel de procédure incorrect », Numérateur ou dénominateur égal à une valeur non numérique (ou
qui ne peut être considérée comme telle).

Dans les trois cas, la fonction Divide suivante récupère ces erreurs et
renvoie Null.

Function Divide (numer, denom) as Variant
   Dim Msg as String   Const mnErrDivByZero 11, mnErrOverFlow 6
   Const mnErrBadCall = 5
 On Error GoTo MathHandler 
      Divide  = numer / denom
      Exit Function
MathHandler:
   If Err.Number
 =  MnErrDivByZero Or _
   Err.Number = ErrOverFlow _
   Or Err = ErrBadCall Then
      ' S'il s'agit de l'erreur Division par zéro,Dépassement de       ' capacité ou Appel de procédure incorrect, renvoie Null.
      Divide = Null 
   Else
      ' Affiche un message d'erreur inattendue.
      Msg = "Erreur inattendue " &amp; Err.Number 
      Msg = Msg &amp; ": " &amp; Err.Description
      msgBox Msg, vbExclamation
   End If
      ' Dans tous les cas, Resume Next poursuit l'exécution 
      ' à partir de l'instruction Exit Function.
   Resume Next 
End Function


Reprise de l'exécution à partir d'une ligne spécifiée
Vous pouvez également utiliser l'instruction Resume Next lorsqu'une erreur survient dans une
boucle et que vous devez relancer l'opération. Si vous préférez, vous pouvez
recourir à l'instruction Resume line pour renvoyer le contrôle à une
étiquette de ligne spécifiée.

L'exemple suivant, variante de l'exemple FileExists décrit plus haut,
illustre l'emploi de l'instruction Resume line. Cette fonction permet à
l'utilisateur de saisir une spécification de fichier qui est renvoyée par la
fonction si le fichier existe effectivement.

Function VerifyFile As String
   Const mnErrBadFileName  = 52, _
   mnErrDriveDoorOpen =  71
   Const mnErrDeviceUnavailable = 68, _
   mnErrInvalidFileName = 64
   Dim strPrompt As String, strMsg As String, _
   strFileSpec As String
   strPrompt = "Tapez la spécification de fichier à vérifier :"
StartHere:
   ' Commence par une spécification par défaut.
   strFileSpec = "*.*"
   strMsg = strMsg &amp; vbCRLF &amp; strPrompt
   ' Permet à l'utilisateur de modifier la spécification par défaut.
   strFileSpec = InputBox(strMsg, "Recherche du fichier", _
   strFileSpec, 100, 100)
   ' Sort si l'utilisateur supprime la spécification par défaut.
   If strFileSpec = "" Then Exit Function
   On Error GoTo Handler
      VerifyFile = Dir(strFileSpec)
      Exit Function
Handler:
   ' Analyse le code d'erreur et charge le message.
   Select Case Err.Number
      Case ErrInvalidFileName, ErrBadFileName
         strMsg = "Votre spécification de fichier " 
         strMsg = strMsg &amp; "n'est pas valide;essayez-en une autre."
      Case MnErrDriveDoorOpen
         strMsg = "Fermez le volet du lecteur " 
         strMsg = strMsg &amp; "et essayez de nouveau."
      Case MnErrDeviceUnavailable
         strMsg = "Le lecteur spécifié est introuvable." 
         strMsg = strMsg &amp; " Essayez de nouveau."
      Case Else
         Dim intErrNum As Integer
         intErrNum = Err.Number
         ' Efface l'objet Err.
         Err.Clear
         ' Régénère l'erreur.
         Err.Raise Number:= intErrNum
   End Select
   ' Retour à l'étiquette StartHere pour que l'utilisateur puisse 
   ' essayer un autre nom de fichier.
   Resume StartHere 
End Function


Si le programme trouve un fichier correspondant à la spécification, la
fonction renvoie son nom. S'il ne trouve pas de fichier correspondant, la
fonction renvoie une chaîne de longueur nulle. Si une des erreurs prévues se
produit, un message est affecté à la variable
strMsg
et l'exécution
repasse à l'étiquette
StartHere
. L'utilisateur peut éventuellement
taper alors un autre chemin d'accès et une autre spécification de fichier
corrects.

Si l'erreur est inattendue, le segment Case Else régénère l'erreur afin
qu'elle puisse être récupérée par le prochain gestionnaire d'erreurs figurant
dans la liste d'appels. En effet, si l'erreur n'était pas régénérée, l'exécution
du code se poursuivrait au niveau de la ligne
Resume StartHere
. En
régénérant l'erreur, vous provoquez en réalité sa répétition et donc la nouvelle
erreur sera
récupérée au niveau suivant dans la pile des appels.

Pour plus d'informations    reportez-vous à la section « Ordre
de gestion
d'erreurs », plus loin dans ce chapitre.

Note   Bien que l'utilisation de l'instruction
Resume line constitue un moyen parfaitement légitime d'écrire du code,
une prolifération de renvois aux étiquettes de ligne risque de rendre le code
plus difficile à comprendre et à déboguer.

@++

<hr size ="2" width="100%" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
0
Rejoignez-nous