Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Gestion non structurée des erreurs

5 réponses
Avatar
Serge Nazarian
Bonjour,

Je lis sur le site de Microsoft
(http://msdn.microsoft.com/fr-fr/library/ka13cy19%28v=VS.80%29.aspx) :
**********************
La valeur zéro ou des chaînes de longueur nulle ("") sont réaffectées aux
propriétés de l'objet Err après une instruction Exit Sub, Exit Function,
Exit Property ou Resume Next dans une routine de gestion des erreurs.
L'utilisation d'un formulaire de l'instruction Resume en dehors d'une
routine de gestion des erreurs ne réinitialisera pas les propriétés de
l'objet Err. Vous pouvez utiliser la méthode Clear pour réinitialiser
explicitement Err.
**********************

J'ai pourtant le code suivant qui fonctionne comme attendu.
**********************
On Error Resume Next
Windows(Fichier).Activate
If Err.Number <> 0 Then
Workbooks.Open Filename:=Chemin & Fichier
Err.Clear
End If
**********************

Quand l'erreur se produit (i.e. quand Fichier n'est pas ouvert), comment se
fait-il que la variable Err.Number ne soit remise à zéro après le Resume
Next comme me le laisse supposer l'aide Microsoft ?

Merci pour toute aide.
Cordialement,
--
Serge Nazarian

5 réponses

Avatar
LE TROLL
Bonjour,

Tu écris :

If ...
On Error Resume Next
Windows(Fichier).Activate
If Err.Number <> 0 Then : Workbooks.Open Filename:=Chemin & Fichier
Err.Clear
End If

Ce n'est pas bon, car "on error resume next" fait que la procédure ne va
pas tenir compte de l'erreur, alors "if err" ne sert à rien, l'erreur sera
toujours à 0, et une erreur à 0 n'est pas une erreur, mais une situation
normale, donc le "clear" ne sert à rien dans la mesure où le "on error..."
inhibe une erreur <> 0, on reste donc à 0.

Il faut faire

Sub procedure()
on error goto erreur
' ton instruction pouvant produire une erreur
exit sub
erreur:
select case Err
case 1 : 'msgbox... instruction...
case 2 : '...
case else
' ...
end select
on error resume next ' clear ...
end sub

Soit :

sub ...()
On Error goto erreur
Windows(Fichier).Activate
exit sub
erreur:
Workbooks.Open Filename:=Chemin & Fichier
End Sub

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Serge Nazarian" a écrit dans le message de
news:4bf3946e$0$24105$
Bonjour,

Je lis sur le site de Microsoft
(http://msdn.microsoft.com/fr-fr/library/ka13cy19%28v=VS.80%29.aspx) :
**********************
La valeur zéro ou des chaînes de longueur nulle ("") sont réaffectées aux
propriétés de l'objet Err après une instruction Exit Sub, Exit Function,
Exit Property ou Resume Next dans une routine de gestion des erreurs.
L'utilisation d'un formulaire de l'instruction Resume en dehors d'une
routine de gestion des erreurs ne réinitialisera pas les propriétés de
l'objet Err. Vous pouvez utiliser la méthode Clear pour réinitialiser
explicitement Err.
**********************

J'ai pourtant le code suivant qui fonctionne comme attendu.
**********************
On Error Resume Next
Windows(Fichier).Activate
If Err.Number <> 0 Then
Workbooks.Open Filename:=Chemin & Fichier
Err.Clear
End If
**********************

Quand l'erreur se produit (i.e. quand Fichier n'est pas ouvert), comment
se fait-il que la variable Err.Number ne soit remise à zéro après le
Resume Next comme me le laisse supposer l'aide Microsoft ?

Merci pour toute aide.
Cordialement,
--
Serge Nazarian


Avatar
Serge Nazarian
Dans le message :,
LE TROLL <le a écrit :
Bonjour,

Tu écris :

If ...
On Error Resume Next
Windows(Fichier).Activate
If Err.Number <> 0 Then : Workbooks.Open Filename:=Chemin &
Fichier Err.Clear
End If



Il n'y a pas de if...

Ce n'est pas bon, car "on error resume next" fait que la procédure
ne va pas tenir compte de l'erreur, alors "if err" ne sert à rien,
l'erreur sera toujours à 0, et une erreur à 0 n'est pas une erreur,
mais une situation normale, donc le "clear" ne sert à rien dans la
mesure où le "on error..." inhibe une erreur <> 0, on reste donc à 0.



D'après le site Microsoft, l'erreur sera à zéro.
Mais des essais, faits en rajoutant des MsgBox, montrent que cela ne se
passe pas comme indiqué. D'où ma question.


Il faut faire



On peut faire...car le code fonctionne comme attendu !

Cordialement,
--
Serge Nazarian
Avatar
LE TROLL
Y a pas de "if" tu dis, et ça c'est quoi ?

"If Err.Number <> 0 Then"

Et c'est ton code !

A part ça, tu veux dire que ce que tu as écrit te satisfait et
fonctionne, tu plaisantes là !
Je maintiens que ta pseudo gestion d'erreur c'est de la décoration, car
tu dis sans le savoir a priori, tu dis au gestionnaire d'erreur de ne pas
tenir compte de l'erreur éventuelle dans ta procédure, alors après, un peu
plus bas, tester si l'erreur est différente de "0" ça fait pitié vu le ton
sur lequel tu l'entend, c'est-à-dire en faisant comme si tu savais tout en
posant la question, faut choisir !

La façon la plus simple de gérer une erreur unique dans une procédure est la
suivante :

sub ...()
on error goto erreur
... commande pouvant produire l'erreur
exit sub
erreur:
msgbox err ...
on error resume next
en sub

Et si tu ne veut pas d'erreur, bien qu'il faille éviter de jouer avec ça :

sub ...()
on error resume next
... commande pouvant produire l'erreur
end sub


Pour ce qui est de "CLEAR" qui semble te préoccuper, il faut avant
comprendre le mécanisme, une erreur se gère implicitement dans une procédure
(ou fonction), elle n'a de valeur que dans ce bloc sus-cité (portée locale
donc), sauf passage du paramètre de l'erreur évidement, de facto pour
inhiber l'erreur c'est "on error resume next" dans le bloc, mais en dehors,
cas par exemple d'un passage entre procédures de la valeur d'une erreur on
va cette fois utiliser "clear" pour le RAZ du gestionnaire d'erreurs "Err",
mais encore une fois, ne pas trop jouer avec car ça peut t'annuler une
erreur qui vient de se produire ailleurs, la portée de "clear" étant
"globale".
Par ailleurs, on peut aussi gérer les erreurs en cascade, comme susdit,
passer ses paramètres, mais bon, comprends déjà ça avant d'aller plus loin,
sinon tu vas faire des noeuds.

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Serge Nazarian" a écrit dans le message de
news:4bf3b4b4$0$12224$
Dans le message :,
LE TROLL <le a écrit :
Bonjour,

Tu écris :

If ...
On Error Resume Next
Windows(Fichier).Activate
If Err.Number <> 0 Then : Workbooks.Open Filename:=Chemin &
Fichier Err.Clear
End If



Il n'y a pas de if...

Ce n'est pas bon, car "on error resume next" fait que la procédure
ne va pas tenir compte de l'erreur, alors "if err" ne sert à rien,
l'erreur sera toujours à 0, et une erreur à 0 n'est pas une erreur,
mais une situation normale, donc le "clear" ne sert à rien dans la
mesure où le "on error..." inhibe une erreur <> 0, on reste donc à 0.



D'après le site Microsoft, l'erreur sera à zéro.
Mais des essais, faits en rajoutant des MsgBox, montrent que cela ne se
passe pas comme indiqué. D'où ma question.


Il faut faire



On peut faire...car le code fonctionne comme attendu !

Cordialement,
--
Serge Nazarian

Avatar
Michel__D
Bonjour,

Serge Nazarian a écrit :
Bonjour,

Je lis sur le site de Microsoft
(http://msdn.microsoft.com/fr-fr/library/ka13cy19%28v=VS.80%29.aspx) :
**********************
La valeur zéro ou des chaînes de longueur nulle ("") sont réaffectées
aux propriétés de l'objet Err après une instruction Exit Sub, Exit
Function, Exit Property ou Resume Next dans une routine de gestion des
erreurs. L'utilisation d'un formulaire de l'instruction Resume en
dehors d'une routine de gestion des erreurs ne réinitialisera pas les
propriétés de l'objet Err. Vous pouvez utiliser la méthode Clear pour
réinitialiser explicitement Err.
**********************

J'ai pourtant le code suivant qui fonctionne comme attendu.
**********************
On Error Resume Next
Windows(Fichier).Activate
If Err.Number <> 0 Then
Workbooks.Open Filename:=Chemin & Fichier
Err.Clear
End If
**********************

Quand l'erreur se produit (i.e. quand Fichier n'est pas ouvert),
comment se fait-il que la variable Err.Number ne soit remise à zéro
après le Resume Next comme me le laisse supposer l'aide Microsoft ?



L'aide de Microsoft indique que lorsque une gestion des erreurs est mise
en place comme par exemple avec :
On Error Resume Next
Les propriétés de la variable objet Err sont réinitialisées aprés une
instruction Exit Sub, Exit Function, ..., Resume Next

Mais ce Resume Next ne correspond pas au Resume Next de On Error Resume
Next qui sert a activer la gestion d'erreur.

Nota (pour certain): La gestion d'erreur induite avec On Error Resume
Next consiste à poursuivre l'exécution du code
tout en positionnant les propriétés de la variable objet Err sur les
différentes valeurs des erreurs éventuellements rencontrées.
Avatar
Serge Nazarian
Dans le message :4bf3946e$0$24105$,
Serge Nazarian a écrit :
Bonjour,

Je lis sur le site de Microsoft
(http://msdn.microsoft.com/fr-fr/library/ka13cy19%28v=VS.80%29.aspx) :
**********************
La valeur zéro ou des chaînes de longueur nulle ("") sont réaffectées
aux propriétés de l'objet Err après une instruction Exit Sub, Exit
Function, Exit Property ou Resume Next dans une routine de gestion
des erreurs. L'utilisation d'un formulaire de l'instruction Resume en
dehors d'une routine de gestion des erreurs ne réinitialisera pas les
propriétés de l'objet Err. Vous pouvez utiliser la méthode Clear pour
réinitialiser explicitement Err.
**********************

J'ai pourtant le code suivant qui fonctionne comme attendu.
**********************
On Error Resume Next
Windows(Fichier).Activate
If Err.Number <> 0 Then
Workbooks.Open Filename:=Chemin & Fichier
Err.Clear
End If
**********************

Quand l'erreur se produit (i.e. quand Fichier n'est pas ouvert),
comment se fait-il que la variable Err.Number ne soit remise à zéro
après le Resume Next comme me le laisse supposer l'aide Microsoft ?

Merci pour toute aide.
Cordialement,



Merci à Jacky et à Michel_D qui ont compris ma question et y ont répondu de
manière très satisfaisante. Jacky de façon condensée et Michel_D de façon
détaillée.
Je me réjouis qu'existent des gens compétents mais dont la compétence
n'exclue ni l'envie de partager leur savoir ni la courtoisie.

Cordialement,
--
Serge Nazarian