Vue d'ensemble de la gestion non structurée des exceptions

Mise à jour : novembre 2007

Dans la gestion non structurée des exceptions, vous devez placer une instruction On Error au début d'un bloc de code pour pouvoir gérer les erreurs qui se produisent dans ce bloc. Lorsqu'une exception est générée dans une procédure après l'exécution de l'instruction On Error, le programme effectue un branchement vers l'argument de ligne spécifié dans l'instruction On Error. L'argument de ligne, qui représente le numéro de ligne ou l'étiquette de ligne, indique l'emplacement du gestionnaire d'exceptions.

Parfois, un appel est effectué de la procédure d'origine vers une autre procédure, et une exception se produit dans la procédure appelée. Dans ces cas-là, si la procédure appelée ne gère pas l'exception, celle-ci est retournée à la procédure appelante, et l'exécution effectue un branchement vers l'argument de ligne.

Remarque :

Une gestion non structurée des erreurs à l'aide de On Error peut nuire aux performances de l'application et produire un code difficile à déboguer et à gérer. La gestion structurée des erreurs est la méthode conseillée. Pour plus d'informations, consultez Vue d'ensemble de la gestion structurée des exceptions pour Visual Basic.

On Error GoTo Line

L'instruction On Error GoTo Line suppose que le code de gestion des erreurs débute à la ligne spécifiée dans l'argument line requis. Si une erreur d'exécution se produit, le contrôle effectue un branchement vers l'étiquette ou le numéro de ligne spécifié dans l'argument, ce qui entraîne l'activation du gestionnaire d'erreur*.* La ligne spécifiée doit se trouver dans la même procédure que l'instruction On Error GoTo Line, sinon Visual Basic génère une erreur de compilation. L'exemple suivant illustre l'utilisation d'un gestionnaire d'erreur avec une étiquette de ligne :

Sub TestSub
   On Error GoTo ErrorHandler
      ' Code that may or may not contain errors.
   Exit Sub

   ErrorHandler:
      ' Code that handles errors.
      Resume
End Sub

L'exemple contient un gestionnaire d'erreur nommé ErrorHandler. Si le code de la sous-routine TestSub génère une erreur, Visual Basic exécute immédiatement le code qui suit l'étiquette ErrorHandler. À la fin du bloc de gestion d'erreur, l'instruction Resume repasse le contrôle à la ligne de code où l'erreur s'est produite initialement. Le reste de la sous-routine continue alors à s'exécuter comme si l'erreur ne s'était pas produite.

Remarque :

Vous devez placer une instruction ExitSub immédiatement avant le bloc de gestion d'erreur. Sinon, Visual Basic exécute le code de gestion d'erreur lorsqu'il atteint la fin de la sous-routine, ce qui peut provoquer des résultats non souhaités ou inattendus.

On Error Resume Next

L'instruction On Error Resume Next spécifie que dans l'éventualité d'une erreur d'exécution, le contrôle passe à l'instruction située immédiatement après celle où l'erreur s'est produite. À ce stade, l'exécution continue. On Error Resume Next vous permet de placer des routines de gestion d'erreur aux emplacements où les erreurs vont se produire, au lieu de transférer le contrôle à un autre emplacement dans la procédure.

Remarque :

Si votre procédure en appelle une autre, l'instruction On Error Resume Next devient inactive durant l'exécution de la procédure appelée. Par conséquent, vous devez placer une instruction On Error Resume Next dans chaque procédure appelée qui le nécessite. Ceci est nécessaire, car le comportement de Resume Next ne s'applique qu'à la procédure contenant l'instruction On Error Resume Next. Si une erreur non gérée se produit dans une procédure appelée, l'exception est retournée à la procédure appelante et l'exécution reprend à l'instruction située juste après l'appel. Dans ces cas-là, l'erreur n'est pas gérée.

L'instruction Resume peut également être utilisée de manière autonome, en dehors de l'instruction On Error. Lorsque Resume est utilisée de cette manière, Visual Basic retourne le contrôle à l'instruction à l'origine de l'erreur. Resume s'utilise généralement après qu'un gestionnaire d'erreur a corrigé l'erreur.

Visual Basic fournit également l'instruction ResumeNext, qui dirige le contrôle vers la ligne située immédiatement après la ligne de code à l'origine de l'erreur. Vous pouvez utiliser Resume Next dans les cas où une erreur ne doit pas empêcher votre application de fonctionner. Vous pouvez également l'utiliser si une erreur ne peut pas modifier les résultats attendus de votre sous-routine.

Une autre variante de l'instruction Resume est Resume Line, qui est semblable à On Error GoTo Line. Resume Line passe le contrôle à une ligne que vous spécifiez dans l'argument line. Vous ne pouvez utiliser Resume Line que dans un gestionnaire d'erreur.

Remarque :

Lorsque vous déboguez votre code, vous devez désactiver l'instruction On Error Resume Next.

On Error GoTo 0

L'instruction On Error GoTo 0 désactive tout gestionnaire d'erreurs dans la procédure actuelle. Si vous n'ajoutez pas d'instruction On Error GoTo 0, le gestionnaire d'erreurs reste désactivé lorsque la procédure contenant le gestionnaire d'exceptions termine son exécution.

Remarque :

L'instruction On Error GoTo 0 ne spécifie pas la ligne 0 comme le début du code de gestion d'erreur, même si la procédure contient effectivement une ligne numérotée 0.

On Error GoTo -1

L'instruction On Error GoTo -1 désactive tout gestionnaire d'exceptions dans la procédure actuelle. Si vous n'ajoutez pas d'instruction On Error GoTo -1, l'exception est automatiquement désactivée à la fin de l'exécution de la procédure en cours.

Remarque :

L'instruction On Error GoTo -1 ne spécifie pas la ligne -1 comme le début du code de gestion d'erreur, même si la procédure contient effectivement une ligne numérotée -1.

Exemple de gestionnaire d'exceptions non structuré

Dans le code suivant, le gestionnaire d'exceptions se nomme DivideByZero et gère une erreur spécifique (la tentative de division par zéro). Si une autre erreur se produit, Visual Basic génère une erreur d'exécution et arrête l'application.

Sub ErrorTest ()
' Declare variables.
   Dim x As Integer, y As Integer, z As Integer
   ' The exception handler is named "DivideByZero".
   On Error GoTo DivideByZero
   ' The main part of the code, which might cause an error.
   x = 2
   y = 0
   z = x \ y

   ' This line disables the exception handler.
   On Error GoTo 0
      Console.WriteLine(x & "/" & y & " = " & z)

   ' Exit the subroutine before the error-handling code.
   ' Failure to do so can create unexpected results.
   Exit Sub

   ' This is the exception handler, which deals with the error.
   DivideByZero:
   ' Include a friendly message to let the user know what is happening.
   Console.WriteLine("You have attempted to divide by zero!")

   ' Provide a solution to the error.
   y = 2

   ' The Resume statement returns to the point at which
   ' the error first occurred, so the application
   ' can continue to run.
   Resume

End Sub

Voir aussi

Tâches

Comment : extraire des informations à partir d'un objet Error

Concepts

Objet Err dans la gestion non structurée des exceptions

Introduction à la gestion des exceptions

Types d'erreurs

Cas d'utilisation de la gestion structurée ou non structurée des exceptions

Référence

End, instruction

Err, objet (Visual Basic)

Exit, instruction (Visual Basic)

On Error, instruction (Visual Basic)

Resume, instruction