Delen via


Bij foutinstructie (Visual Basic)

Maakt een foutafhandelingsroutine mogelijk en geeft de locatie van de routine binnen een procedure aan; kan ook worden gebruikt om een foutafhandelingsroutine uit te schakelen. De On Error instructie wordt gebruikt in niet-gestructureerde foutafhandeling en kan worden gebruikt in plaats van gestructureerde uitzonderingsafhandeling. Gestructureerde uitzonderingsafhandeling is ingebouwd in .NET, is over het algemeen efficiënter en wordt daarom aanbevolen bij het verwerken van runtimefouten in uw toepassing.

Zonder foutafhandeling of uitzonderingsafhandeling is een runtimefout onherstelbare fout: er wordt een foutbericht weergegeven en de uitvoering wordt gestopt.

Notitie

Het Error trefwoord wordt ook gebruikt in de foutverklaring, die wordt ondersteund voor compatibiliteit met eerdere versies.

Syntaxis

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

generator

Term Definitie
GoToLijn Hiermee schakelt u de foutafhandelingsroutine in die begint bij de regel die is opgegeven in het vereiste regelargument . Het regelargument is een regellabel of regelnummer. Als er een runtimefout optreedt, vertakkingen naar de opgegeven regel, waardoor de fouthandler actief wordt. De opgegeven regel moet zich in dezelfde procedure bevinden als de On Error instructie of er wordt een compilatiefout opgetreden.
GoTo 0 Schakelt ingeschakelde fouthandler in de huidige procedure uit en stelt deze opnieuw in.Nothing
GoTo -1 Schakelt ingeschakelde uitzondering in de huidige procedure uit en stelt deze opnieuw in.Nothing
Resume Next Hiermee geeft u op dat wanneer er een runtimefout optreedt, het besturingselement direct na de instructie gaat waarin de fout is opgetreden en dat de uitvoering vanaf dat punt wordt voortgezet. Gebruik dit formulier in plaats On Error GoTo van bij het openen van objecten.

Opmerkingen

Notitie

We raden u aan om waar mogelijk gestructureerde uitzonderingsafhandeling in uw code te gebruiken in plaats van ongestructureerde uitzonderingsafhandeling en de On Error instructie te gebruiken. Zie Proberen voor meer informatie ... Vangen... Tot slot verklaring.

Een 'ingeschakelde' fouthandler is een handler die is ingeschakeld door een On Error instructie. Een 'actieve' fouthandler is een ingeschakelde handler die een fout verwerkt.

Als er een fout optreedt terwijl een fouthandler actief is (tussen het optreden van de fout en een Resume, Exit Subof Exit PropertyExit Functioninstructie), kan de fouthandler van de huidige procedure de fout niet verwerken. Het besturingselement keert terug naar de aanroepprocedure.

Als de aanroepende procedure een ingeschakelde fouthandler heeft, wordt deze geactiveerd om de fout te verwerken. Als de fouthandler van de aanroepende procedure ook actief is, wordt het besturingselement teruggegeven via eerdere aanroepende procedures totdat een ingeschakelde, maar inactieve fouthandler wordt gevonden. Als er geen dergelijke fouthandler wordt gevonden, is de fout fataal op het punt waarop deze daadwerkelijk is opgetreden.

Telkens wanneer de fouthandler de besturing weer doorgeeft aan een aanroepprocedure, wordt deze procedure de huidige procedure. Zodra een fout wordt verwerkt door een fouthandler in een procedure, wordt de uitvoering hervat in de huidige procedure op het punt dat is aangewezen door de Resume instructie.

Notitie

Een foutafhandelingsroutine is geen Sub procedure of procedure Function . Het is een codesectie die is gemarkeerd door een regellabel of een regelnummer.

Getaleigenschap

Foutafhandelingsroutines zijn afhankelijk van de waarde in de Number eigenschap van het Err object om de oorzaak van de fout te bepalen. De routine moet relevante eigenschapswaarden in het Err object testen of opslaan voordat een andere fout kan optreden of voordat een procedure die een fout kan veroorzaken, wordt aangeroepen. De eigenschapswaarden in het Err object weerspiegelen alleen de meest recente fout. Het foutbericht dat is gekoppeld aan Err.Number , bevindt zich in Err.Description.

Werpinstructie

Een fout die wordt gegenereerd met de Err.Raise methode, stelt de Exception eigenschap in op een zojuist gemaakte instantie van de Exception klasse. Om de verhoging van uitzonderingen van afgeleide uitzonderingstypen te ondersteunen, wordt een Throw instructie ondersteund in de taal. Hierbij wordt één parameter gebruikt die het uitzonderingsexemplaren is. In het volgende voorbeeld ziet u hoe deze functies kunnen worden gebruikt met de bestaande ondersteuning voor het afhandelen van uitzonderingen:

    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

U ziet dat de On Error GoTo instructie alle fouten onderschept, ongeacht de uitzonderingsklasse.

Bij volgende fout hervatten

On Error Resume Next zorgt ervoor dat de uitvoering doorgaat met de instructie onmiddellijk na de instructie die de runtimefout heeft veroorzaakt, of met de instructie direct na de meest recente aanroep van de procedure die de On Error Resume Next instructie bevat. Met deze instructie kan de uitvoering worden voortgezet ondanks een runtimefout. U kunt de routine voor foutafhandeling plaatsen waar de fout optreedt in plaats van het besturingselement over te dragen naar een andere locatie binnen de procedure. Een On Error Resume Next instructie wordt inactief wanneer een andere procedure wordt aangeroepen, dus u moet een On Error Resume Next instructie uitvoeren in elke zogenaamde routine als u inline foutafhandeling binnen die routine wilt.

Notitie

De On Error Resume Next constructie kan de voorkeur hebben bij On Error GoTo het afhandelen van fouten die zijn gegenereerd tijdens de toegang tot andere objecten. Controleren Err na elke interactie met een object verwijdert dubbelzinnigheid over welk object is geopend door de code. U kunt er zeker van zijn dat het object de foutcode heeft Err.Numbergeplaatst en in welk object de fout oorspronkelijk is gegenereerd (het object dat is opgegeven in Err.Source).

Bij fout GoTo 0

On Error GoTo 0 schakelt foutafhandeling in de huidige procedure uit. Er wordt geen regel 0 opgegeven als het begin van de code voor foutafhandeling, zelfs als de procedure een regelnummer 0 bevat. Zonder instructie On Error GoTo 0 wordt een fouthandler automatisch uitgeschakeld wanneer een procedure wordt afgesloten.

Bij fout GoTo -1

On Error GoTo -1 schakelt de uitzondering in de huidige procedure uit. Hiermee wordt regel -1 niet opgegeven als het begin van de code voor foutafhandeling, zelfs als de procedure een regelnummer -1 bevat. Zonder instructie On Error GoTo -1 wordt een uitzondering automatisch uitgeschakeld wanneer een procedure wordt afgesloten.

Als u wilt voorkomen dat code voor foutafhandeling wordt uitgevoerd wanneer er geen fout is opgetreden, plaatst u een Exit Sub, Exit Functionof Exit Property instructie direct vóór de foutafhandelingsroutine, zoals in het volgende fragment:

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

Hier volgt de code voor foutafhandeling de Exit Sub instructie en wordt de End Sub instructie voorafgegaan om deze te scheiden van de procedurestroom. U kunt code voor foutafhandeling overal in een procedure plaatsen.

Niet-aftrapte fouten

Niet-afgetrokken fouten in objecten worden geretourneerd naar de besturingstoepassing wanneer het object wordt uitgevoerd als een uitvoerbaar bestand. In de ontwikkelomgeving worden niet-afgepakte fouten alleen geretourneerd naar de beheertoepassing als de juiste opties zijn ingesteld. Raadpleeg de documentatie van uw hosttoepassing voor een beschrijving van welke opties moeten worden ingesteld tijdens foutopsporing, hoe u deze instelt en of de host klassen kan maken.

Als u een object maakt dat toegang heeft tot andere objecten, moet u proberen om niet-verwerkte fouten te verwerken die ze doorgeven. Als u dat niet kunt, wijst u de foutcodes Err.Number toe aan een van uw eigen fouten en geeft u deze vervolgens weer door aan de aanroeper van uw object. U moet uw fout opgeven door uw foutcode toe te voegen aan de VbObjectError constante. Als uw foutcode bijvoorbeeld 1052 is, wijst u deze als volgt toe:

Err.Number = vbObjectError + 1052

Let op

Systeemfouten tijdens aanroepen naar Windows DLL's (Dynamic Link Libraries) veroorzaken geen uitzonderingen en kunnen niet worden gevangen door Visual Basic-fouten. Wanneer u DLL-functies aanroept, moet u elke retourwaarde controleren op slagen of mislukken (volgens de API-specificaties) en in het geval van een fout de waarde in de eigenschap van LastDLLError het Err object controleren.

Opmerking

In dit voorbeeld wordt eerst de On Error GoTo instructie gebruikt om de locatie van een foutafhandelingsroutine binnen een procedure op te geven. In het voorbeeld genereert een poging om te delen door nul foutnummer 6. De fout wordt verwerkt in de foutafhandelingsroutine en het besturingselement wordt vervolgens geretourneerd naar de instructie die de fout heeft veroorzaakt. De On Error GoTo 0 instructie schakelt foutafvanging uit. Vervolgens wordt de On Error Resume Next instructie gebruikt om foutopname uit te stellen, zodat de context voor de fout die door de volgende instructie is gegenereerd, zeker bekend kan zijn. Let op: Err.Clear wordt gebruikt om de eigenschappen van het Err object te wissen nadat de fout is verwerkt.

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

Vereisten

Naamruimte:Microsoft.VisualBasic

Assembly: Visual Basic Runtime Library (in Microsoft.VisualBasic.dll)

Zie ook