Table of contents
TOC
Réduire la table des matières
Développer la table des matières

On Error, instruction

office 365 dev account|Dernière mise à jour: 04/10/2017
|
1 Contributeur

Valide une routine de gestion d'erreur et définit son emplacement au sein d'une procédure ; cette instruction permet également d'invalider une routine de gestion d'erreur.

Syntaxe

On ErrorGoToline

On ErrorResume Next

On ErrorGoTo0

La syntaxe de l'instruction On Error peut prendre les formes suivantes :

InstructionDescription
On Error GoTolineValide la routine de gestion d'erreur commençant à la ligne indiquée dans l' argumentline obligatoire. L'argument line peut être une étiquette de ligne ou un numéro de ligne. En cas d' erreur d'exécution, le contrôle est transmis au point indiqué dans l'argument line , ce qui valide le gestionnaire d'erreurs. . La ligne indiquée dans l'argument line doit se trouver dans la même procédure que l'instruction On Error; sinon, une erreur se produit au moment de la compilation.
On Error Resume NextLorsqu'une erreur d'exécution survient, le contrôle est transmis à l' instruction qui suit immédiatement celle où l'erreur s'est produite, et l'exécution continue. Il est recommandé d'utiliser cette formulation plutôt que l'instruction On Error GoTo pour accéder à des objets.
On Error GoTo 0Invalide dans la procédure actuelle tout gestionnaire d'erreurs validé.

Remarque

En l'absence d'instruction On Error, toute erreur d'exécution est irrécupérable ; en d'autres termes, un message d'erreur apparaît et l'exécution s'arrête.

Un gestionnaire d'erreurs est « validé » lorsqu'il a été désigné par une instruction On Error; un gestionnaire d'erreurs « actif » est un gestionnaire validé qui traite une erreur. Si une erreur se produit alors qu'un gestionnaire d'erreurs est actif (c'est-à-dire entre la ligne où survient une erreur et une instruction Resume, Exit Sub, Exit Function ou Exit Property ), le gestionnaire d'erreurs de la procédure en cours ne peut pas gérer l'erreur. Le contrôle revient à la procédure appelante. Si la procédure appelante possède un gestionnaire d'erreurs validé, il est activé afin de gérer l'erreur. Si le gestionnaire d'erreurs de la procédure appelante est également actif, le contrôle est restitué aux procédures appelantes antérieures jusqu'à ce qu'un gestionnaire d'erreurs validé mais inactif soit trouvé. Si aucun gestionnaire d'erreurs validé et inactif n'est trouvé, l'erreur est irrécupérable à l'emplacement où elle s'est produite. Chaque fois que le gestionnaire d'erreurs repasse le contrôle à une procédure appelante, cette procédure devient la procédure en cours. Lorsqu'une erreur est gérée par un gestionnaire d'erreurs dans n'importe quelle procédure, l'exécution reprend dans la procédure en cours à l'emplacement désigné par l'instruction Resume.

Remarque Une routine de gestion d'erreur n'est pas une procédure Sub ou Function. Il s'agit d'une section de code désignée par une étiquette de ligne ou un numéro de ligne.

Les routines de gestion d'erreur utilisent la valeur de la propriété Number de l'objet Err pour déterminer la cause de l'erreur. La routine de gestion d'erreur doit tester ou sauvegarder les valeurs de la propriété pertinente de l'objet Err avant qu'une autre erreur ne se produise ou qu'une procédure susceptible de causer une erreur ne soit appelée. Les valeurs de la propriété de l'objet Err ne reflètent que l'erreur la plus récente. Le message d'erreur associé à Err.Number est contenu dans Err.Description.

L'instruction On Error Resume Next permet de poursuivre l'exécution à partir de l'instruction qui suit immédiatement celle qui a causé l'erreur d'exécution, ou qui suit immédiatement le dernier appel exécuté depuis la procédure contenant l'instruction On Error Resume Next. L'exécution peut ainsi continuer en dépit d'une erreur d'exécution. Vous pouvez placer la routine de gestion d'erreur au point où une erreur pourrait se produire, au lieu de transférer le contrôle vers un autre point de la procédure. Une instruction On Error Resume Next devient inactive lorsqu'une autre procédure est appelée ; il est donc conseillé de placer une instruction On Error Resume Next dans chaque routine nécessitant une gestion en ligne des erreurs survenues dans cette routine.

Remarque La construction On Error Resume Next est plus appropriée que l'instruction On Error GoTo pour gérer les erreurs générées lors de l'accès à des objets. La vérification de la variable Err après chaque interaction avec un objet permet de savoir à quel objet votre code accédait lorsque l'erreur est survenue. Vous pouvez ainsi être certain de l'objet qui a placé le numéro d'erreur dans Err.Number et de celui qui a généré l'erreur initiale (objet précisé dans Err.Source ).

L'instruction On Error GoTo 0 permet de désactiver la gestion d'erreur dans la procédure en cours. Cette instruction ne déclare pas la ligne 0 comme étant le début du programme de gestion d'erreur, même si la procédure contient une ligne numéro 0. En l'absence d'instruction On Error GoTo 0, le gestionnaire d'erreurs est automatiquement désactivé lors de la sortie de procédure.

Pour éviter que le programme de gestion d'erreur ne s'exécute en l'absence d'erreur, placez une instruction Exit Sub, Exit Function ou Exit Property immédiatement avant la routine de gestion d'erreur, comme l'illustre l'exemple suivant :

Sub InitializeMatrix(Var1, Var2, Var3, Var4)
 On Error GoTo ErrorHandler
 . . .
 Exit Sub
ErrorHandler:
 . . .
 Resume Next
End Sub

Dans cet exemple, le programme de gestion d'erreur suit l'instruction Exit Sub et précède l'instruction End Sub pour la séparer du déroulement normal de la procédure. Les programmes de gestion d'erreur peuvent être placés n'importe où dans une procédure.

Les erreurs issues d'objets et non interceptées sont retournées à l'application de contrôle durant le fonctionnement de l'objet comme fichier exécutable. Dans l'environnement de développement, les erreurs non interceptées ne sont retournées à l'application de contrôle que si les options correspondantes sont définies. Pour plus d'informations sur les options à activer durant le débogage, les méthodes d'activation et la création de classes par l' application hôte reportez-vous à la documentation de cette dernière.

Si vous créez un objet accédant à d'autres objets, il est conseillé de traiter les erreurs que ces derniers ont retransmises sans les traiter. Si vous ne pouvez pas les gérer, établissez une correspondance entre le code d'erreur dans Err.Number et une des erreurs que vous aurez définies, puis retransmettez-le au code appelant votre objet. Pour définir une erreur, ajoutez votre numéro d'erreur à la constante vbObjectError. Par exemple, avec le numéro d'erreur 1052, procédez de la manière suivante :

Err.Number = vbObjectError + 1052

Remarque Les erreurs système se produisant au cours d'appels de bibliothèques de liens dynamiques Windows (DLL) ou de ressources de code Macintosh ne génèrent pas d'exception et ne peuvent pas être interceptées par Visual Basic. . Lors de l'appel de fonctions de DLL, vous devez vérifier si chaque valeur retournée indique un succès ou un échec (selon les spécifications de l'API) et, en cas d'échec, vérifier la valeur de la propriété LastDLLError de l'objet Err. La propriété LastDLLError retourne toujours zéro sur le Macintosh.

Exemple

Cet exemple utilise tout d'abord l'instruction On Error GoTo pour indiquer l'emplacement d'une routine de gestion d'erreur au sein d'une procédure. Dans notre exemple, la tentative de suppression d'un fichier ouvert produit l'erreur 55. Cette erreur est traitée dans la routine de gestion d'erreur et le contrôle est ensuite retourné à l'instruction qui a provoqué l'erreur. L'instruction On Error GoTo 0 désactive la récupération d'erreur. L'instruction On Error Resume Next permet ensuite de différer la récupération d'erreur de sorte que le contexte de l'erreur générée par la prochaine instruction puisse être identifié clairement. Notez que Err.Clear est utilisé pour effacer les propriétés de l'objet Err une fois que l'erreur a été traitée.

Sub OnErrorStatementDemo()
 On Error GoTo ErrorHandler ' Enable error-handling routine.
 Open "TESTFILE" For Output As #1 ' Open file for output.
 Kill "TESTFILE" ' Attempt to delete open
 ' file.
 On Error Goto 0 ' Turn off error trapping.
 On Error Resume Next ' Defer error trapping.
 ObjectRef = GetObject("MyWord.Basic") ' Try to start nonexistent
 ' object, then test for
'Check for likely Automation errors.
 If Err.Number = 440 Or Err.Number = 432 Then
 ' Tell user what happened. Then clear the Err object.
 Msg = "There was an error attempting to open the Automation object!"
 MsgBox Msg, , "Deferred Error Test"
 Err.Clear ' Clear Err object fields
 End If
Exit Sub ' Exit to avoid handler.
ErrorHandler: ' Error-handling routine.
 Select Case Err.Number ' Evaluate error number.
 Case 55 ' "File already open" error.
 Close #1 ' Close open file.
 Case Else
 ' Handle other situations here...
 End Select
 Resume ' Resume execution at same line
 ' that caused the error.
End Sub
© 2018 Microsoft