On Error, instruction (Visual Basic)

Active une routine de gestion des erreurs et spécifie l’emplacement de la routine dans une procédure ; peut également être utilisé pour désactiver une routine de gestion des erreurs. L’instruction On Error est utilisée dans la gestion non structurée des erreurs et peut être utilisée à la place de la gestion structurée des exceptions. La gestion structurée des exceptions est intégrée à .NET, est généralement plus efficace et est donc recommandée lors de la gestion des erreurs d’exécution dans votre application.

Sans gestion des erreurs ou des exceptions, toute erreur d’exécution qui se produit est irrécupérable : un message d’erreur s’affiche et l’exécution s’arrête.

Notes

Le mot clé Error est également utilisé dans l’instruction d’erreur, qui est prise en charge pour la compatibilité descendante.

Syntaxe

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Éléments

Terme Définition
GoToline Active la routine de gestion des erreurs qui commence à la ligne spécifiée dans l’argument requis line. L’argument line est toute valeur d’étiquette de ligne ou de numéro de ligne. Si une erreur au moment de l’exécution se produit, le contrôle se dirige vers la ligne spécifiée, ce qui rend le gestionnaire d’erreurs actif. La ligne spécifiée doit se trouver dans la même procédure que l’instruction On Error, sinon une erreur de compilation se produit.
GoTo 0 Désactive le gestionnaire d’erreurs activé dans la procédure actuelle et le réinitialise à Nothing.
GoTo -1 Désactive l’exception activée dans la procédure actuelle et la réinitialise à Nothing.
Resume Next Spécifie que lorsqu’une erreur d’exécution se produit, le contrôle passe à l’instruction immédiatement après l’instruction où l’erreur s’est produite, et l’exécution continue à partir de ce point. Utilisez cette forme plutôt que On Error GoTo lors de l’accès aux objets.

Notes

Notes

Nous vous recommandons d’utiliser la gestion structurée des exceptions dans votre code aussi souvent que possible, plutôt que d’utiliser la gestion non structurée des exceptions et l’instruction On Error. Pour plus d’informations, consultez Try...Catch...Finally, instruction.

Un gestionnaire d’erreurs « activé » est un gestionnaire d’erreurs activé par une instruction On Error. Un gestionnaire d’erreurs « actif » est un gestionnaire activé qui est en cours de gestion d’une erreur.

Si une erreur se produit alors qu’un gestionnaire d’erreurs est actif (entre l’occurrence de l’erreur et une instruction Resume, Exit Sub, Exit Function ou Exit Property), le gestionnaire d’erreurs de la procédure actuelle ne peut pas gérer l’erreur. Le contrôle revient à la procédure appelante.

Si la procédure appelante a un gestionnaire d’erreurs activé, elle est activée pour gérer l’erreur. Si le gestionnaire d’erreurs de la procédure appelante est également actif, le contrôle revient à travers les procédures d’appel précédentes jusqu’à ce qu’un gestionnaire d’erreurs activé, mais inactif, soit trouvé. Si aucun gestionnaire d’erreurs de ce type n’est trouvé, l’erreur est irrécupérable au point où elle s’est effectivement produite.

Chaque fois que le gestionnaire d’erreurs revient à une procédure appelante, cette procédure devient la procédure actuelle. Une fois qu’une erreur est gérée par un gestionnaire d’erreurs dans une procédure, l’exécution reprend dans la procédure actuelle au point désigné par l’instruction Resume.

Notes

Une routine de gestion des erreurs n’est pas une procédure Sub ou une procédure Function. Il s’agit d’une section de code marquée par une étiquette de ligne ou un numéro de ligne.

Number, propriété

Les routines de gestion des erreurs s’appuient sur la valeur de la propriété Number de l’objet Err pour déterminer la cause de l’erreur. La routine doit tester ou enregistrer les valeurs de propriété pertinentes dans l’objet Err avant qu’une autre erreur se produise ou avant qu’une procédure susceptible de provoquer une erreur soit appelée. Les valeurs de propriété dans l’objet Err reflètent uniquement l’erreur la plus récente. Le message d’erreur associé à Err.Number est contenu dans Err.Description.

Throw, instruction

Une erreur générée avec la méthode Err.Raise définit la propriété Exception sur une instance nouvellement créée de la classe Exception. Pour prendre en charge la levée d’exceptions de types d’exceptions dérivés, une instruction Throw est prise en charge dans le langage. Elle prend un paramètre unique qui est l’instance d’exception à lever. L’exemple suivant montre comment ces fonctionnalités peuvent être utilisées avec la prise en charge existante de la gestion des exceptions :

    On Error GoTo Handler
    Throw New DivideByZeroException()
Handler:
    If (TypeOf Err.GetException() Is DivideByZeroException) Then
    ' Code for handling the error is entered here.
    End If

Notez que l’instruction On Error GoTo intercepte toutes les erreurs, quelle que soit la classe d’exception.

On Error Resume Next

On Error Resume Next entraîne la poursuite de l’exécution avec l’instruction immédiatement après l’instruction qui a provoqué l’erreur d’exécution, ou avec l’instruction immédiatement après l’appel le plus récent de la procédure contenant l’instruction On Error Resume Next. Cette instruction permet la poursuite de l’exécution malgré une erreur d’exécution. Vous pouvez placer la routine de gestion des erreurs à l’emplacement où l’erreur se produirait plutôt que de transférer le contrôle vers un autre emplacement au sein de la procédure. Une instruction On Error Resume Next devient inactive lorsqu’une autre procédure est appelée. Vous devez donc exécuter une instruction On Error Resume Next dans chaque routine appelée si vous souhaitez gérer les erreurs inline dans cette routine.

Notes

La construction On Error Resume Next peut être préférable à On Error GoTo lors de la gestion des erreurs générées pendant l’accès à d’autres objets. La vérification Err après chaque interaction avec un objet élimine l’ambiguïté quant à l’objet auquel le code a accédé. Vous pouvez vérifier quel objet a placé le code d’erreur dans Err.Number, ainsi que l’objet qui a généré l’erreur à l’origine (l’objet spécifié dans Err.Source).

On Error GoTo 0

On Error GoTo 0 désactive la gestion des erreurs dans la procédure actuelle. Il ne spécifie pas la ligne 0 comme début du code de gestion des erreurs, même si la procédure contient une ligne numérotée 0. Sans instruction On Error GoTo 0, un gestionnaire d’erreurs est automatiquement désactivé lorsqu’une procédure est terminée.

On Error GoTo -1

On Error GoTo -1 désactive l’exception dans la procédure actuelle. Il ne spécifie pas la ligne -1 comme début du code de gestion des erreurs, même si la procédure contient une ligne numérotée -1. Sans instruction On Error GoTo -1, une exception est automatiquement désactivée lorsqu’une procédure est terminée.

Pour empêcher l’exécution du code de gestion des erreurs lorsqu’aucune erreur n’a eu lieu, placez une instruction Exit Sub, Exit Function ou Exit Property immédiatement avant la routine de gestion des erreurs, comme dans le fragment suivant :

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
   On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next
End Sub

Ici, le code de gestion des erreurs suit l’instruction Exit Sub et précède l’instruction End Sub pour le séparer du flux de procédure. Vous pouvez placer le code de gestion des erreurs n’importe où dans une procédure.

Erreurs non interceptées

Les erreurs non interceptées dans les objets sont retournées à l’application de contrôle lorsque l’objet s’exécute en tant que fichier exécutable. Dans l’environnement de développement, les erreurs non interceptées sont retournées à l’application de contrôle uniquement si les options appropriées sont définies. Consultez la documentation de votre application hôte pour obtenir une description des options à définir pendant le débogage, de la façon de les définir et de la possibilité pour l’hôte de créer des classes.

Si vous créez un objet qui accède à d’autres objets, vous devez essayer de gérer les erreurs non gérées qu’ils transmettent. Si vous ne pouvez pas le faire, mappez les codes d’erreur dans Err.Number à l’une de vos propres erreurs, puis transmettez-les à l’appelant de votre objet. Vous devez spécifier votre erreur en ajoutant votre code d’erreur à la constante VbObjectError. Par exemple, si votre code d’erreur est 1052, affectez-le comme suit :

Err.Number = vbObjectError + 1052

Attention

Les erreurs système lors des appels aux bibliothèques de liens dynamiques (DLL) Windows ne déclenchent pas d’exceptions et ne peuvent pas être interceptées avec l’interception d’erreurs Visual Basic. Lors de l’appel de fonctions DLL, vous devez vérifier chaque valeur de retour pour déterminer la réussite ou l’échec (en fonction des spécifications de l’API) et, en cas d’échec, vérifier la valeur dans la propriété LastDLLError de l’objet Err.

Exemple

Cet exemple utilise d’abord l’instruction On Error GoTo pour spécifier l’emplacement d’une routine de gestion des erreurs dans une procédure. Dans l’exemple, une tentative de division par zéro génère l’erreur numéro 6. L’erreur est gérée dans la routine de gestion des erreurs, et le contrôle est ensuite retourné à l’instruction à l’origine de l’erreur. L’instruction On Error GoTo 0 désactive l’interception des erreurs. Ensuite, l’instruction On Error Resume Next est utilisée pour différer l’interception des erreurs afin que le contexte de l’erreur générée par l’instruction suivante puisse être connu pour certains. Notez que Err.Clear permet d’effacer les propriétés de l’objet Err une fois l’erreur gérée.

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer = 32
   Dim y As Integer = 0
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox(Msg, , "Divide by zero error")
      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 6   ' Divide by zero error
         MsgBox("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at the statement immediately 
                ' following the statement where the error occurred.
End Sub

Configuration requise

Espace de noms :Microsoft.VisualBasic

Assembly : Bibliothèque Visual Basic Runtime (dans Microsoft.VisualBasic.dll)

Voir aussi