Erreur zéro ligne zéro [Résolu]

Signaler
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
-
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
-
Bonjour,
Dans un programme qui fonctionne la plupart du temps correctement j'ai très rarement une erreur interceptée par "on error goto" mais qui donne Err.Number = 0 et Erl = 0.
Comment est-ce possible ?

20 réponses

Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Merci pour ta réponse mais je n'y trouve pas la solution,
je répète que 999 fois sur 1000 ça fonctionne
voici le début et la fin de la procédure en question
Private Sub AskPin_Click()
3740     On Error GoTo AskPin_Click_Error

3750  If Len(Userid) < 6 Then
3760      MsgBox ("Le nom d'utilisateur doit comporter au moins 6 caractères"), vbExclamation
3770      Exit Sub
3780  End If
...
4910  Instr1.Visible = True
4920  Instr3.Visible = False
4930  End If
4940  On Error GoTo 0
4950  Exit Sub
AskPin_Click_Error:
4960      ErrHdl ("AskPin_Click dans Connexion")
End Sub
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Bonjour !
Tu peux supprimer le
On Error Goto 0
car le gestionnaire d'erreurs est automatiquement désactivé en sortant de la Sub
Sinon je ne vois pas la raison : le On Error Goto est bien la première ligne de la Sub pour gérer l'erreur ce qui est tout à fait correct
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Pour ajouter une gestion d'erreur à une procédure j'utilise MZ-Tools.
Il insère d'office toutes les lignes ci-dessous (sauf Private Sub et End Sub).

Je pense qu'il n'y a pas d'erreur 0 dans ce module, peut-être une erreur dans une autre procédure ou une autre fonction appelée et qui n'a pas de gestion d'erreur ?

Private Sub Help_Click()
On Error GoTo Help_Click_Error
...
On Error GoTo 0
Exit Sub

Help_Click_Error:
    ErrHdl ("Help_Click dans Angles")
End Sub
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
J'ai trouvé un cas où j'ai une erreur zéro
Private Sub Drawgraph()
30170    On Error GoTo Drawgraph_Error
...
30990 Graph.Line (Val(KH) + GardeX, Graph.ScaleHeight - GardeY)-(Val(KH) + GardeX, GardeY), vbYellow
KH = "-1000000000" : pourquoi erreur 0 et pas overflow ?
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Bonsoir !
Sans certitude je pense ceci .
La fonction Val ne sait pas quel type de valeur elle doit retourner si elle est utilisée sans variable .
Exemples
Dim A as Integer = Val("120") ' retourne un Integer
Dim B as Long = Val("120") ' retourne la même valeur mais de type Long


Dans ton code il y a juste
 Val(KH)

Or cette valeur elle est convertie en quelle type ? en aucun type de base et ceci explique l'erreur 0
Au lieu d'utiliser Val il est préférable d'utiliser Cint ou Clng pour des valeurs entières . Là le type de retour pour la valeur est bien définie

De plus KH valant "-1000000000" soit - 1 milliard ? cela rentre forcément dans le type Long ( de - 2147483648 à + 2147483647 ) si on prend sa valeur numérique

De plus pour le fonction Line les paramètres concernant les points sont de quel type ?
de souvenir ce serait Single mais sans certitude .
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Merci pour ta réponse, c'est probablement ça.
Syntaxe de la méthode .line : object.Line [Step] (x1, y1) [Step] - (x2,y2), [color], [B][F]
x1, y1, x2 et y2 doivent être des Single.
L'erreur vient du fait que KH ne devrait pas contenir cette valeur, c'est ça que je dois corriger,
J'ai parfois erreur 0 avec un n° de ligne : je peux donc chercher dans cette direction puisque je connais l'instruction fautive.

Cependant le sujet initial est "Erreur zéro ligne zéro" : je ne comprends pas pourquoi j'ai parfois aussi ligne zéro et je ne sais pas où chercher puisque je ne sais pas quelle instruction provoque l'erreur.
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Bonjour,
Je pense que j'ai trouvé : dans le module en question j'ai ceci
Private Sub AskPin_Click()
3740     On Error GoTo AskPin_Click_Error
...
4610    On Error Resume Next
4620    ObjSendMail.Send
...
4940  On Error GoTo 0
4950  Exit Sub
AskPin_Click_Error:
4960      ErrHdl ("AskPin_Click dans Connexion")
End Sub

Je souhaite éviter qu'un problème lors de l'envoi du mail plante l'application.
Est-il possible qu'on ait une erreur 0 ligne 0 si une erreur se produit après "On error resume next" ?
Pour l'éviter suffit-il d'ajouter "On Error GoTo AskPin_Click_Error" après "ObjSendMail.Send" ?
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Bonjour !
Moi je ferais ceci en supprimant le
On Error Goto 0

Private Sub AskPin_Click()
3740    On Error GoTo AskPin_Click_Error
...
4620    SendMail() ' sub pour envoi mail
...
4950    Exit Sub
AskPin_Click_Error:
4960      ErrHdl ("AskPin_Click dans Connexion")
End Sub

Private Sub SendMail() 
    
    On Error ResumeNext
    ObjSendMail.Send



il faut que ObjSendMail soit en Private pour toute la Form ou tout le Module
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Merci pour ta réponse,
Dim ObjSendMail se trouve dans (General) de la Form.

Je comprends ce que tu proposes mais je ne comprends pas pourquoi.
Quel est l'avantage par rapport à mettre "on error resume next" avant et "on error goto" après ObjSendMail.send ?
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
bonsoir
Ainsi le "On Resume Next" ne gère que l'envoi de mail
Et cela rend plus clair le code avec un seul "On Error Goto AskPin_Click_Error"

J'ai oublié le "End Sub" dans la sub SendMail()
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
OK, je vais faire comme ça.
Peux-tu me confirmer que l'oubli de "on error goto" après le "on error resume next" peut être la cause de Erreur zéro ligne zéro ?
Merci
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
bonjour !
Je ne peux te le confirmer ( VB6 est loin pour moi : 10 ans que je suis passé à VB Net et C# )
Cependant une remarque : le "On Error Goto" ne doit pas être utilisé à tout bout de champ : il est là pour gérer les erreurs imprévues ( perte de connexion Internet par exemple et là tu n'y peux rien et tu ne sais pas où elle se produira dans ton code )
Dans ce cas le "On Error Goto" se justifie dans le code gérant le téléchargement d'un fichier par exemple .
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
J'ai toujours des erreurs zéro, je ne sais pas pourquoi.
Exemples d'instructions qui donnent parfois (rarement) une erreur zéro
Tank.ListIndex = 0 ' Tank est une listbox
Page.Text = Clipboard.GetText ' Page est une textbox
i = 0 ' i est un integer
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
"Avant" je n'avais jamais d'erreur zéro.
J'ai peut-être fait une modification qui provoque cela mais je ne vois pas ce que ça peut être.
Si quelqu'un a une idée ...
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Bonjour !
L'idée que j'ai est simple : enlever tous les "On Error Goto" et "On Error Resume Next" et empêcher l'erreur de se produire au cas par cas avec des If ....... End If.
C'est ce que je ferais . Regarde ma remarque à mon précédent message

Exemple basique
if Fichier = "" then ' gère erreur nom de fichier inexistant
      ' Message d'erreur
      Exit sub
End if
' on lit le fichier ici

Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Bonjour,
Il n'y a plus de resume next.
Je comprends bien qu'il vaut mieux vérifier si tout est correct afin qu'une erreur ne se produise pas; c'est ce que je fais en général, par exemple vérifier qu'une variable n'est pas nulle avant de diviser par cette variable, vérifier si un fichier existe avant de l'ouvrir ou de le supprimer, ...
Cependant je ne peux pas tout prévoir ni tester toutes les possibilités, le logiciel est distribué chez des milliers d'utilisateurs : que veux-tu qu'ils fassent s'il reçoivent un message d'erreur ?
Alors j'intercepte les erreurs et je m'envoie un rapport utilisable (code erreur, ligne, certains paramètres et même une capture de la fenêtre); ainsi je peux facilement corriger l'erreur.
Messages postés
14758
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 septembre 2020
433
Bonjour

Je n’ai pas la solution à ton problème, je ne code presque plus en vb6 depuis 2007. Il ne me reste qu’un vieux projet qui tourne sous seven 32 bit que je maintiens difficilement de temps à autre.

Et c’est sur la base de ce projet que je te propose cette hypothèse: l’OS.
Ce projet utilise des ocx 32 bits qui eux-mêmes utilisent des dll 32 ou 16 bits.
Les dll 16bits ne fonctionnent plus sur les OS 64 bits et certains composants 32 bits fonctionnent plus ou moins bien d’un OS à l’autre.

Ainsi, mon vieux projet démarre sous 7 64bits et sous 8.x mais ça plante en cours d’utilisation. Et sous 10 il ne démarre plus du tout.

Contrairement à toi, je n’ai pas de client, j’ai toujours codé pour les besoins de l’équipe qui m’employait. Mon employeur à décidé de passer tout le parc informatique à W10, en raison de la fin du support étendu de W7. Mes anciens collègues m’ont donc demandé de migrer ce vieux projet vers W10, j’y ai passé beaucoup plus de temps que ce que j’aurais dû par rapport à mon affection actuelle sans succès. Au bout d’un moment, on en est venu à la conclusion qu’il fallait tout refaire de zéro dans un langage qui a encore cours aujourd’hui.
En attendant qu’ils prennent une décision, ils utilisent une machine virtuelle.

Tu as peut-être une piste à creuser de ce côté là.

Quoiqu’il en soit, VB95 a raison, l’interception d’exception doit être « l’exception » justement et non la règle. Une bonne erreur est une erreur évitée.
Pour reprendre un de tes exemples, Graph.Line a besoin de single, alors les variables sont des singles, les conversions et les calculs il est plus prudent de les faire avant en testant au besoin la cohérence des valeurs. Tu dis que -1 milliard n.est pas cohérent, tu vérifies cela avant de convertir, tu préviens ‘utilisateur et tu ne vas pas plus loin quand ça n’est pas bon.
Cela risque de te prendre un temps fou à appliquer, peut-être un autre argument pour changer de langage.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Salut Whis
Je la retiendrai cette phrase : Une bonne erreur est une erreur évitée.
A ++
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Le logiciel tourne chez moi sans problème sous la dernière version de W10.
J'ai actuellement une erreur zéro chez 4 "clients" sur un total de 4.631 utilisateurs.

La difficulté pour changer de langage est que c'est un projet qui a évolué progressivement depuis 2003 et qui contient maintenant 16.000 lignes de code : je n'ai ni le temps ni le budget ni les programmeurs à disposition.
Et puis changer pour quoi ? .NET ? Le temps que je convertisse il sera obsolète !
Messages postés
182
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
19 septembre 2020
5
Salut Hervé,
Dernièrement, j'ai eu une erreur que je qualifierai d'aléatoire.
Les erreurs "Zéro" sont des erreurs de classe, non gérées par l'intercepteur du programme principale. Cela provoque, soit des plantages (des fermetures de l'application sans préavis), soit des retours d'erreurs fantaisistes.
Dans mon cas, c'était un problème de compilation.
J'ai toujours compilé avec quelques optimisations (vitesse…), mais le fait de recompiler le programme avec les valeurs par défaut a permis de supprimer cette erreur qui apparaissait une fois sur cinq executions de la commande.
Donc, essai de recompiler ton programme de manière différente si ton IDE le permet.
Messages postés
14758
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 septembre 2020
433
Le temps que je convertisse il sera obsolète !

Ça se discute. 16000 lignes c'est pas un projet énorme et tu as déjà une part de travail de fait.

Bien sûr, un langage objet ne se code pas comme VB6, il y aurait des concepts à revoir si tu vas vers .Net (C# pas VB, le coté faux ami de VB "bride" la conversion).

Mais ce n'est pas la seule option, Java, Python, Delphi, C++ etc...
Python est très accessible, et se code très vite par rapport aux autres (je n'aime pas le fait que toute la structure ne repose que sur l'indentation, car un espace de trop ou en moins et tout plante, mais un bon IDE sait te le dire).
Je ne pense pas que ces langages vont disparaitre dans les 10 ans à venir (m'enfin on n'est pas à l'abri...), par contre la compatibilité de VB6 n'est plus garantie par Microsoft depuis W7.

Après, ce n'est qu'un point de vue, je n'ai pas tous les tenants, les aboutissants

En tout cas puisque ça fonctionne chez toi, l'OS peut certainement être écarté en tant que cause.

Voir l'idée de JeuDuTaquin.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Salut Whis
VB Net codé correctement n'est pas un " faux ami " loin de là .
Mais inutile de relancer le débat entre VB Net et C#

Ps : Le site s'améliore on dirait : espérons que cela va continuer dans le bon sens
Messages postés
14758
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 septembre 2020
433 >
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020

Au début si, l’homme étant feignant par nature, on a tendance à ne pas faire l’effort d’oublier les automatismes façon vb6. Une syntaxe totalement différente aide à s’en affranchir.
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113 >
Messages postés
14758
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 septembre 2020

C'est pour cela que j'ai mis "correctement "
Ce que je fais maintenant grâce à toi .
A ++
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Que veux-tu dire par "recompiler ton programme de manière différente" ?
Messages postés
182
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
19 septembre 2020
5
Salut Hervé,
Il s'agit de recompiler ton fichier exécutable.

Dans l'onglet "propriété", tu as la possibilité de choisir les paramètres de compilation (ici pour le vb5)


Ces paramètres n'ont pas d'innocuité au niveau de la compatibilité avec le système et certaines options sont plus ou moins bien traitées par les sous-systèmes comme les antivirus ou les programmes en tâche de fond.
De nos jours, le gain en vitesse ou en taille n'est plus vraiment justifié et il est préférable de choisir un mode standard de compatibilité à l'execution.
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Bonjour et merci,
Je n'ai jamais touché à ces valeurs, j'ai actuellement Native - Fast.
Par quoi changer et pourquoi ?

Je répète que cette erreur zéro se produit très rarement (je n'ai pas de nouveau cas), je ne peux donc pas reproduire les mêmes conditions pour tester.
Je n'ai toujours pas compris pourquoi la gestion d'erreur est activée alors que Err.Number = 0.
Si ça se produit n'est-il vraiment pas possible de savoir pourquoi afin de pourvoir corriger ?
Messages postés
182
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
19 septembre 2020
5
Salut Hervé,
Comme je te le disait plus haut, l'erreur se trouve dans une partie non gérée par ton programme, et se trouve dans une dépendance ou une DLL.
Il te sera donc impossible de corriger une OCX, un appel de DLL ou autre.
Certaines OCX n'étaient déjà plus gérées par Windows XP, et il sera difficile de retrouver les sources affin de les rendre compatible.
C'est généralement les appels USER32 ou GDI32, et c'est pour cela que je déconseille l'utilisation de dépendances exotiques que l'on ne peux métriser en son entier.
Donc, si le flag d'erreur est activé par un sous-programme tiers, il te faut agir préventivement et effectuer les tests qui amènent à cette erreur.
Dans ton cas, avec un dysfonctionnement aléatoire et un traçage impossible… tu n'as pas beaucoup de marge de manoeuvre.
Tu peux ajouter des DoEvents , pour éviter l'exécution simultanée de classes, placer des RESETs avant chaque chargement de fichiers, pour fermer les handels d'accès disques…
Mais il y aura toujours des problèmes imprévisibles, surtout si les fonctions internet sont appelées avec ses coupures et instabilités sur certains réseaux.
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
De sorte qu'il n'est pas possible de savoir ce qui provoque une erreur avec un code nul.
Heureusement, c'est très rare, même un utilisateur qui a eu le cas une fois ne l'a plus après alors qu'il appelle les mêmes fonctions du logiciel.
Peut-être juste ajouter un message spécifique dans le cas où on a un code zéro, du style "erreur inattendue" (si vous avez une meilleure idée ...)
Merci en tout cas pour vos réponses.
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Bonjour,
J'ai un nouveau cas, différent, d'erreur zéro dans une fonction qui lit la valeur d'une clé dans le registre
Public Function GetKeyDataValue(KeyValueName As String) As String
          
          Dim OpenKey As Long, hKey As Long, strTempVal As String, KeyValSize As Long, lngI As Long
             
      Dim RegKeyROOT As Long
      Dim KeyDataType As Long
      Dim RegKeyName As String
25660 On Error GoTo GetKeyDataValue_Error

25670 RegKeyROOT = HKEY_CURRENT_USER
25680 KeyDataType = 1 'REG_SZ = 1
25690 RegKeyName = "SOFTWARE\RVReefTools"
             
25700     OpenKey = RegOpenKeyEx(RegKeyROOT, RegKeyName, 0, KEY_ALL_ACCESS, hKey)
25710     If (OpenKey = 0) Then
              
25720         strTempVal = String$(1024, 0)
25730         KeyValSize = 1024
          
25740         OpenKey = RegQueryValueEx(hKey, KeyValueName, 0, KeyDateType, strTempVal, KeyValSize)
          
25750         If (Asc(Mid(strTempVal, KeyValSize, 1)) = 0) Then
25760             GetKeyDataValue = Left(strTempVal, KeyValSize - 1)
25770         Else
25780             GetKeyDataValue = Left(strTempVal, KeyValSize)
25790         End If
25800         OpenKey = RegCloseKey(hKey)
25810     Else
25820         GetKeyDataValue = ""
25830     End If

25840 On Error GoTo 0
25850 Exit Function

GetKeyDataValue_Error:
25860     ErrHdl ("GetKeyDataValue dans Registry")
End Function

erreur zéro sur la ligne 25750 !?
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
J'ai ajouté après OpenKey = RegQueryValueEx(...
If OpenKey = 0 then ...
Else
GetKeyDataValue = ""
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Bonjour
Encore un cas d'erreur zéro
Function LastValue(ByVal i) As Single
57630 On Error GoTo LastValue_Error

57640 LastValue = EmptyData
57650 If TabLast > 0 Then
57660   If DataStyle(0) Then K = DataRaw Else K = DataAdj
57670   For j = Records.ListIndex + 1 To Records.ListCount
57680       If HistoData(i, K, j) <> EmptyData Then LastValue = Abs(HistoData(i, K, j)): Exit For
57690   Next j
57700 End If
57710 On Error GoTo 0
57720 Exit Function

LastValue_Error:
57730     ErrHdl ("LastValue dans LogBook : ListCount=" & Str$(Records.ListCount) & " i=" & Str$(i) & " j=" & Str$(j) & " k=" & Str$(K))
End Function

L'erreur se produit sur la ligne 57680
Les valeurs de i, j et k rapportées dans le message sont dans les clous.
Emptydata est un double = -1000000000
une idée ?
Messages postés
821
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
17 septembre 2020
2
Eureka !
Je ne comprenais toujours pas pourquoi j'ai de temps en temps des erreurs zéro alors que je n'en avais pas avant : avant quoi ?
Ben avant d'ajouter Err.Clear avant l'envoi du rapport d'erreur !
Pourquoi ai-je ajouté cette instruction ?
Je n'en ai plus la moindre idée donc je l'ai supprimée.
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
bonsoir Herve_be
Au cas où tout fonctionnerait sans aucun problème penses à mettre en "Résolu" le post avec le bouton adéquat au début du post .
Merci