Éléments de gestion des erreurs d’exécution

Erreurs et gestion des erreurs

Lors de la programmation d'une application, vous devez prendre en considération les conséquences d'une erreur. Les erreurs peuvent se produire pour deux raisons majeures. Tout d'abord, l'existence d'une condition particulière au moment de l'exécution de l'application peut provoquer l'échec du code, alors que celui-ci est valide par ailleurs. Par exemple, si votre code tente d'ouvrir une table supprimée par l'utilisateur, une erreur se produit. Deuxième hypothèse : votre code contient peut-être une fonction logique incorrecte qui l'empêche d'exécuter l'action prévue. Une erreur se produit, par exemple, si votre code essaie de diviser une valeur par zéro.

Si vous n'avez pas mis en oeuvre de sous-programme de gestion des erreurs, Visual Basic interrompt l'exécution et affiche un message d'erreur lorsqu'une erreur survient dans votre code. L'utilisateur de l'application risque de s'en trouver décontenancé et gêné dans son travail. Vous pouvez éviter bon nombre de problèmes en introduisant dans votre code des routines spécifiques de gestion des erreurs capables de traiter toute erreur susceptible de se produire.

Lors de l'ajout d'une routine de traitement des erreurs à une procédure, envisagez les différentes possibilités de reprise de l'exécution par la procédure en cas d'erreur. Pour que l'exécution soit prise en charge par un sous-programme de traitement des erreurs, vous devez tout d'abord activer un tel sous-programme en intégrant, sous une forme ou une autre, l'instruction On Error à la procédure. L'instruction On Error redirige l'exécution en cas d'erreur. En l'absence d'instruction On Error, Visual Basic interrompt l'exécution et affiche un message d'erreur dès qu'une erreur se produit.

Lorsqu’une erreur se produit dans une procédure avec un Visual Basic d’erreur activé, le message d’erreur normal n’est pas affiché. Au lieu de cela, il adonne l’exécution à un sous-système de gérer les erreurs, s’il en existe un. Lorsque l’exécution passe à un sous-système de gestion des erreurs activé, ce dernier devient actif. Dans le sous-système de gestion des erreurs actif, vous pouvez déterminer le type d’erreur qui s’est produit et le résoudre de la manière que vous choisissez. Access fournit trois objets qui contiennent des informations sur les erreurs qui se sont produites, l’objet Error ADO, l’objet Visual Basic Err et l’objet DAO Error.

Exécution du routage lorsqu’une erreur se produit

Le sous-programme de gestion des erreurs spécifie ce qu'il advient au sein d'une procédure lorsqu'une erreur se produit. Par exemple, vous pouvez faire en sorte qu'une procédure s'arrête en présence d'un certain type d'erreur, ou corriger l'erreur et poursuivre l'exécution. Les instructions On Error et Resume déterminent le fonctionnement de l’exécution en cas d’erreur.

On Error, instruction

L'instruction On Error active ou désactive une routine de traitement des erreurs. Lorsqu'un programme de gestion des erreurs est activé, il prend l'exécution en charge dès qu'une erreur survient.

Il existe trois formes de l’instruction On Error : On Error GoTo label, On Error GoTo 0 et On Error Resume Next. L’instruction On Error GoTo label active une routine de gestion des erreurs, en commençant par la ligne sur laquelle l’instruction est trouvée. Activez la routine de gestion des erreurs avant la première ligne sur laquelle une erreur est susceptible de se produire. Si une erreur survient alors que le gestionnaire d’erreurs est actif, l’exécution se poursuit à partir de la ligne spécifiée par l’argument label.

La ligne spécifiée par l’argument étiquette doit être le début de la routine de gestion des erreurs. Par exemple, la procédure suivante spécifie qu’en cas d’erreur, l’exécution passe à la ligne étiquetée :

Function MayCauseAnError() 
    ' Enable error handler. 
    On Error GoTo Error_MayCauseAnError 
    .            ' Include code here that may generate error. 
    . 
    . 
 
Error_MayCauseAnError: 
    .            ' Include code here to handle error. 
    . 
    . 
End Function

L'instruction On Error GoTo 0 désactive le traitement des erreurs au sein d'une procédure. Elle ne définit pas la ligne 0 en tant que début du code de traitement des erreurs, même si la procédure contient une ligne portant le numéro 0. Si votre code ne comporte pas d'instruction On Error GoTo 0, le sous-programme de gestion des erreurs est automatiquement désactivé à l'issue de la procédure. L'instruction On Error GoTo 0 réinitialise les propriétés de l'objet Err, tout comme la méthode Clear de l'objet Err.

L'instruction On Error Resume Next ignore la ligne responsable de l'erreur et poursuit l'exécution à partir de la ligne suivante. L'exécution n'est donc pas interrompue. Vous pouvez utiliser l'instruction On Error Resume Next pour vérifier les propriétés de l'objet Err immédiatement après une ligne sur laquelle vous anticipez une erreur, et corriger l'erreur au sein de la procédure plutôt que dans une routine de traitement des erreurs.

Resume, instruction

L'instruction Resume dans le sous-programme de gestion des erreurs permet de reprendre l'exécution dans la procédure principale. Vous pouvez inclure une instruction Resume à l'intérieur d'une routine de gestion des erreurs pour que l'exécution se poursuive à partir d'un point spécifique d'une procédure. Toutefois, l'instruction Resume n'est pas absolument nécessaire ; vous pouvez aussi mettre un terme à la procédure après le sous-programme de traitement des erreurs.

Il existe trois formes de l’instruction Resume. L’instruction Resume ou Resume 0 renvoie l’exécution à la ligne à laquelle l’erreur s’est produite. L’instruction Resume Next renvoie l’exécution à la ligne qui suit immédiatement la ligne à laquelle l’erreur s’est produite. L’instruction Resume label renvoie l’exécution à la ligne spécifiée par l’argument étiquette. L’argument étiquette doit indiquer une étiquette de ligne ou un numéro de ligne.

L'instruction Resume ou Resume 0 s'utilise généralement lorsque l'utilisateur doit apporter une correction. Par exemple, si vous demandez à l'utilisateur de spécifier le nom de la table à ouvrir, et si l'utilisateur indique le nom d'une table qui n'existe pas, vous pouvez interroger une nouvelle fois l'utilisateur et reprendre l'exécution à partir de l'instruction ayant généré l'erreur.

Utilisez l'instruction Resume Next si votre code corrige l'erreur au sein d'une routine de traitement des erreurs, et si vous voulez poursuivre l'exécution en ignorant la ligne responsable de l'erreur. Vous utilisez l’instruction Resume label lorsque vous souhaitez poursuivre l’exécution à un autre point de la procédure, spécifié par l’argument étiquette. Vous pouvez, par exemple, reprendre l'exécution au niveau d'une routine de sortie, comme indiqué dans la section suivante.

Sortie d’une procédure

Lorsque vous incluez une routine de traitement des erreurs à une procédure, incluez également une routine de sortie, pour faire en sorte que la routine de traitement des erreurs ne s'exécute que si une erreur se produit. Vous pouvez spécifier une routine de sortie en utilisant un libellé de ligne, tout comme vous le faites pour une routine de traitement des erreurs.

Ainsi, vous pouvez ajouter une routine de sortie à l'exemple de la section précédente. Si aucune erreur ne se produit, la routine de sortie s'exécute après la procédure principale. Si une erreur se produit, l'exécution reprend au niveau de la routine de sortie après l'exécution du code contenu dans la routine de traitement des erreurs. La routine de sortie comporte une instruction Exit.

Function MayCauseAnError() 
    ' Enable error handler. 
    On Error GoTo Error_MayCauseAnError 
    .            ' Include code here that may generate error. 
    . 
    . 
 
Exit_MayCauseAnError: 
    Exit Function 
 
Error_MayCauseAnError: 
    .            ' Include code to handle error. 
    . 
    . 
    ' Resume execution with exit routine to exit function. 
    Resume Exit_MayCauseAnError 
End Function

Gestion des erreurs dans les procédures imbrmbrées

Lorsqu’une erreur se produit dans une procédure imbriée qui n’a pas de traitement des erreurs activé, Visual Basic recherche dans la liste des appels un sous-système de traitement des erreurs activé dans une autre procédure, plutôt que d’arrêter simplement l’exécution. Cela permet à votre code de corriger l’erreur dans une autre procédure. Par exemple, supposons que la procédure A appelle la procédure B et la procédure B appelle la procédure C. Si une erreur se produit dans la procédure C et qu’aucun sous-programme de traitement des erreurs n’est activé, Visual Basic vérifie la procédure B, puis la procédure A, pour savoir s’il s’agit d’un sous-programme de traitement des erreurs activé. S’il en existe un, l’exécution passe à ce handler d’erreurs. Si ce n’est pas le cas, l’exécution s’arrête et un message d’erreur s’affiche.

Visual Basic recherche également une routine de traitement des erreurs activée dans la liste d'appels qui précède lorsqu'une erreur se produit à l'intérieur d'une routine de traitement des erreurs active. Vous pouvez forcer Visual Basic à effectuer une recherche vers l’arrière dans la liste d’appels en augmentant une erreur au sein d’un sous-système de traitement des erreurs actif avec la méthode Raise de l’objet Err. Cette technique se révèle très utile pour traiter les erreurs imprévues au sein d'une routine de gestion des erreurs. Si une erreur inattendue se produit et si vous la générez à nouveau à l'intérieur de la routine de traitement des erreurs, la liste des appels qui précède est passée en revue pour trouver un autre sous-programme de gestion des erreurs, que vous pouvez alors utiliser pour corriger l'erreur.

Supposez par exemple qu'une routine de traitement des erreurs soit activée dans la Procédure C, mais qu'elle ne soit pas capable de corriger l'erreur générée. Lorsque le programme de traitement des erreurs a passé en revue toutes les erreurs que vous aviez anticipées, il se peut qu'il génère à nouveau l'erreur initiale. La liste d'appels est alors parcourue, et l'exécution reprend au niveau de la routine de traitement des erreurs de la Procédure B, si elle existe, lui donnant ainsi la possibilité de corriger l'erreur. Si aucune routine de traitement des erreurs ne se trouve dans la Procédure B, ou si elle ne parvient pas à corriger l'erreur et la génère à nouveau, l'exécution est prise en charge par le programme de gestion des erreurs de la Procédure A, en supposant qu'il existe.

Pour illustrer ce concept autrement, supposez que vous utilisez une procédure imbriquée incluant une routine de gestion des erreurs pour une erreur d'incompatibilité de type, erreur que vous avez anticipée. À un certain stade de la Procédure C, une erreur de type division-par-zéro, que vous n'aviez pas anticipée, se produit. Si vous avez inclus une instruction relative à la reproduction de l'erreur initiale, la liste des appels est passée en revue, et un autre programme de traitement des erreurs activé, le cas échéant, reprend l'exécution. Si vous avez corrigé une erreur de type division-par-zéro dans une autre procédure de la liste d'appels, l'erreur est corrigée. Si votre code ne génère pas l'erreur une nouvelle fois, la procédure se poursuit sans corriger l'erreur de type division-par-zéro, ce qui risque d'entraîner la production d'autres erreurs au sein des procédures imbriquées.

En résumé, Visual Basic recherche un sous-programme de traitement des erreurs activé dans la liste d'appels si :

  • Une erreur se produit dans une procédure n'incluant pas de routine de traitement des erreurs activée.

  • Une erreur se produit à l'intérieur d'un sous-programme de traitement des erreurs actif. Si vous utilisez la méthode Raise de l'objet Err pour générer une erreur, vous pouvez forcer Visual Basic à rechercher une routine de traitement des erreurs activée dans la liste d'appels.

Obtention d’informations sur une erreur

Lorsque l'exécution est prise en charge par la routine de traitement des erreurs, le code doit déterminer le type de l'erreur qui s'est produite et corriger cette erreur. Visual Basic et Access fournissent plusieurs éléments de langage que vous pouvez utiliser pour obtenir des informations relatives à une erreur spécifique. Chacun de ces éléments correspond à un type d'erreur différent. Des erreurs étant susceptibles de survenir à différents endroits de votre application, vous devez déterminer l'élément qui sera utilisé dans votre code en fonction des erreurs prévues.

Les éléments de langage disponibles pour le traitement des erreurs sont :

Objet Err

L'objet Err est fourni par Visual Basic. Lorsqu'une erreur se produit dans Visual Basic, les informations relatives à cette erreur sont stockées dans l'objet Err. L'objet Err conserve les informations se rapportant à une seule erreur à la fois. Lorsqu'une nouvelle erreur est générée, l'objet Err est mis à jour à partir des informations relatives à cette dernière erreur.

Pour obtenir des informations sur une erreur particulière, vous pouvez utiliser les propriétés et méthodes de l’objet Err :

  • La propriété Number est la propriété par défaut de l'objet Err; elle renvoie le numéro identifiant l'erreur qui s'est produite.
  • La propriété Description de l’objet Err renvoie la chaîne descriptive associée à Visual Basic erreur.
  • La méthode Clear efface les informations relatives à l'erreur actuelle qui sont contenues dans l'objet Err.
  • La méthode Raise génère une erreur spécifique et définit les propriétés de l'objet Err en fonction des informations relatives à cette erreur.

L'exemple ci-dessous indique comment utiliser l'objet Err dans une procédure susceptible de provoquer une erreur d'incompatibilité de type :

Function MayCauseAnError() 
    ' Declare constant to represent likely error. 
    Const conTypeMismatch As Integer = 13 
 
    On Error GoTo Error_MayCauseAnError 
        .            ' Include code here that may generate error. 
        . 
        . 
 
Exit_MayCauseAnError: 
    Exit Function 
 
Error_MayCauseAnError: 
    ' Check Err object properties. 
    If Err = conTypeMismatch Then 
        .            ' Include code to handle error. 
        . 
        . 
    Else 
        ' Regenerate original error. 
        Dim intErrNum As Integer 
        intErrNum = Err 
        Err.Clear 
        Err.Raise intErrNum 
    End If 
    ' Resume execution with exit routine to exit function. 
    Resume Exit_MayCauseAnError 
End Function

Notez que dans l'exemple qui précède, la méthode Raise est utilisée pour générer à nouveau l'erreur initiale. Si une erreur autre qu'une erreur d'incompatibilité de type se produit, la liste d'appels est passée en revue et l'exécution est prise en charge par un autre sous-programme de traitement des erreurs activé, s'il existe.

L'objet Err vous fournit toutes les informations dont vous pouvez avoir besoin en ce qui concerne les erreurs Visual Basic. Toutefois, il ne vous donne pas d’informations complètes sur les erreurs Access ou les erreurs du moteur de base de données Access. Access et Data Access Objects (DAO)) fournissent des éléments de langage supplémentaires pour vous aider à corriger ces erreurs.

Objet Error et collection Errors

L'objet Error et la collection Errors sont fournis par les objets ADO et DAO. L'objet Error représente une erreur ADO ou DAO. Une même opération ADO ou DAO peut causer plusieurs erreurs, notamment si vous effectuez des opérations de type DAO ODBC. Un objet Error est associé à chaque erreur qui se produit au cours d'une opération spécifique d'accès aux données. Tous les objets Error associés à une opération ADO ou DAO spécifique sont enregistrés dans la collection Errors, l'erreur qui se trouve sur le niveau le plus bas constituant le premier objet de la collection, et celle qui se trouve sur le niveau le plus élevé constituant le dernier objet de la collection.

Lorsqu'une erreur ADO ou DAO se produit, l'objet Visual Basic Err contient le numéro de l'erreur désignant le premier objet de la collection Errors. Pour déterminer si d'autres erreurs ADO ou DAO se sont produites, vérifiez la collection Errors. Les valeurs de la propriété ADO Number ou de la propriété DAO Number ainsi que de la propriété ADO Description ou de la propriété DAO Description du premier objet Error de la collection Errors doivent correspondre à celles des propriétés Number et Description de l'objet Visual Basic Err.

Méthode AccessError

Vous pouvez utiliser la méthode Raise de l'objet Err pour générer une erreur Visual Basic qui ne s'est pas réellement produite et déterminer la chaîne descriptive associée à cette erreur. Toutefois, vous ne pouvez pas utiliser la méthode Raise pour générer une erreur Access, une erreur ADO ou une erreur DAO. Pour déterminer la chaîne descriptive associée à une erreur Access, une erreur ADO ou une erreur DAO qui ne s’est pas réellement produite, utilisez la méthode AccessError.

Événement Error

Vous pouvez utiliser l'événement Error pour identifier les erreurs qui se produisent dans un formulaire ou un état Access. Si, par exemple, un utilisateur essaie de taper du texte dans un champ de type Date/Heure, l'événement Error se produit. Si vous ajoutez une procédure événementielle Error à un formulaire Employés, puis essayez de taper du texte dans un champ DateEmbauche, la procédure événementielle Error s'exécute.

La procédure événementielle Error utilise un argument de type entier, DataErr. Lorsqu'une procédure événementielle Error se produit, l'argument DataErr contient le numéro de l'erreur Access qui s'est produite. La seule façon de déterminer le numéro de l'erreur qui s'est produite consiste à vérifier la valeur de l'argument DataErr à l'intérieur de la procédure événementielle. Les informations relatives à l'erreur ne sont pas répercutées dans l'objet Err après la production de l'événement Error. Vous pouvez utiliser la valeur de l'argument DataErr avec la méthode AccessError pour déterminer le numéro de l'erreur et sa chaîne descriptive.

Notes

[!REMARQUE] L'instruction Error et la fonction Error sont uniquement fournies pour des raisons de compatibilité avec les versions antérieures. Lors de l'élaboration de code nouveau, utilisez les objets Err et Error, la fonction AccessError et l'événement Error pour obtenir les informations relatives à une erreur.

À propos des collaborateurs

Lien fourni par  Community Icône de membre de la communauté UtterAccess.

UtterAccess est un forum d’aide et wiki de Microsoft Access réputé.

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.