On Error, instruction

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 Error GoToline
On Error Resume Next
On Error GoTo 0

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

Statement Description
On Error GoToline Active la routine de traitement des erreurs qui commence à la ligne spécifiée dans l’argument de ligne requis.

L’argument de ligne est toute étiquette de ligne ou numéro de ligne.

Si une erreur d’exécution se produit, le contrôle se branche à la ligne, ce qui rend le gestionnaire d’erreurs actif.

La ligne spécifiée doit être placée dans la même procédure que l’instruction sur erreur; sinon, une erreur decompilation se produit.
On Error Resume Next Lorsqu’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 0 Invalide dans la procédure actuelle tout gestionnaire d'erreurs validé.

Remarques

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 d’actionResume, 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. Une fois 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

Il est préférable d'utiliser On Error Resume Next plutôt que On Error GoTo lorsque vous gérez des erreurs générées pendant l'accès à d'autres objets. La vérification de l'objet Err après chaque interaction avec un objet supprime toute ambiguïté concernant l'objet auquel le code a accédé. Vous savez exactement quel objet a placé le code d'erreur dans Err.Number et quel objet est à l'origine de l'erreur (l'objet spécifié 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 lors des appels aux bibliothèques de liens dynamiques Windows (DLL) ou aux ressources de code Macintosh ne posent pas d’exceptions et ne peuvent pas être interceptées avec l’interception des erreurs Visual Basic. Lorsque vous appelez des fonctions DLL, vous devez vérifier si chaque valeur de retour est un succès ou un échec (conformément aux spécifications de l’API) et, en cas d’échec, vérifier la valeur de la propriété LastDLLErr de l’objet Err. LastDLLError retourne toujours zéro sur l’ordinateur 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 l’interception des erreurs 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

Voir aussi

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.