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 |
---|---|
GoTo lijn |
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 Sub
of Exit Property
Exit Function
instructie), 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.Number
geplaatst 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 Function
of 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)