Dela via


Vid feluttryck (Visual Basic)

Aktiverar en felhanteringsrutin och anger platsen för rutinen inom en procedur. kan också användas för att inaktivera en felhanteringsrutin. -instruktionen On Error används vid ostrukturerad felhantering och kan användas i stället för strukturerad undantagshantering. Strukturerad undantagshantering är inbyggt i .NET, är i allmänhet mer effektivt och rekommenderas därför vid hantering av körningsfel i ditt program.

Utan felhantering eller undantagshantering är alla körningsfel som inträffar allvarliga: ett felmeddelande visas och körningen stoppas.

Kommentar

Nyckelordet Error används också i felbeskrivningen, som stöds för bakåtkompatibilitet.

Syntax

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

Delar

Period Definition
GoTolinje Aktiverar den felhanteringsrutin som börjar på den rad som anges i det obligatoriska radargumentet . Radargumentet är en radetikett eller ett radnummer. Om ett körningsfel inträffar kontrollerar du grenar till den angivna raden, vilket gör felhanteraren aktiv. Den angivna raden måste vara i samma procedur som -instruktionen On Error , annars uppstår ett kompileringsfel.
GoTo 0 Inaktiverar aktiverad felhanterare i den aktuella proceduren och återställer den till Nothing.
GoTo -1 Inaktiverar aktiverat undantag i den aktuella proceduren och återställer det till Nothing.
Resume Next Anger att när ett körningsfel inträffar går kontrollen till -instruktionen omedelbart efter -instruktionen där felet inträffade och körningen fortsätter från den tidpunkten. Använd det här formuläret i stället On Error GoTo för vid åtkomst till objekt.

Kommentarer

Kommentar

Vi rekommenderar att du använder strukturerad undantagshantering i koden när det är möjligt, i stället för att använda ostrukturerad undantagshantering och -instruktionen On Error . Mer information finns i Prova... Fånga... Slutligen -instruktion.

En "aktiverad" felhanterare är en som aktiveras av en On Error -instruktion. En "aktiv" felhanterare är en aktiverad hanterare som håller på att hantera ett fel.

Om ett fel inträffar när en felhanterare är aktiv (mellan förekomsten av felet och en Resume, Exit Sub, Exit Functioneller Exit Property -instruktion) kan den aktuella procedurens felhanterare inte hantera felet. Kontrollen återgår till anropsproceduren.

Om anropsproceduren har en aktiverad felhanterare aktiveras den för att hantera felet. Om anropsprocedurens felhanterare också är aktiv går kontrollen tillbaka genom tidigare anropsprocedurer tills en aktiverad, men inaktiv, felhanterare hittas. Om ingen sådan felhanterare hittas är felet allvarligt vid den tidpunkt då det faktiskt inträffade.

Varje gång felhanteraren skickar tillbaka kontrollen till en anropsprocedur blir den proceduren den aktuella proceduren. När ett fel hanteras av en felhanterare i en procedur återupptas körningen i den aktuella proceduren vid den punkt som anges av -instruktionen Resume .

Kommentar

En felhanteringsrutin är inte en Sub procedur eller en Function procedur. Det är ett kodavsnitt som har markerats med en radetikett eller ett radnummer.

Nummeregenskap

Rutiner för felhantering förlitar sig på värdet i Number objektets Err egenskap för att fastställa orsaken till felet. Rutinen bör testa eller spara relevanta egenskapsvärden i Err objektet innan något annat fel kan inträffa eller innan en procedur som kan orsaka ett fel anropas. Egenskapsvärdena Err i objektet återspeglar bara det senaste felet. Felmeddelandet som är associerat med Err.Number finns i Err.Description.

Throw-instruktion

Ett fel som uppstår med Err.Raise metoden anger Exception egenskapen till en nyligen skapad instans av Exception klassen. För att stödja höjning av undantag av härledda undantagstyper stöds en Throw -instruktion på språket. Detta tar en enda parameter som är undantagsinstansen som ska genereras. I följande exempel visas hur dessa funktioner kan användas med det befintliga stödet för undantagshantering:

    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

Observera att instruktionen On Error GoTo genererar alla fel, oavsett undantagsklass.

Vid fel återuppta nästa

On Error Resume Next leder till att körningen fortsätter med -instruktionen omedelbart efter -instruktionen som orsakade körningsfelet, eller med -instruktionen omedelbart efter den senaste anropet ut ur proceduren som innehåller -instruktionen On Error Resume Next . Med den här instruktionen kan körningen fortsätta trots ett körningsfel. Du kan placera felhanteringsrutinen där felet skulle inträffa i stället för att överföra kontrollen till en annan plats inom proceduren. En On Error Resume Next instruktion blir inaktiv när en annan procedur anropas, så du bör köra en On Error Resume Next instruktion i varje som kallas rutin om du vill ha intern felhantering inom den rutinen.

Kommentar

Konstruktionen On Error Resume Next kan vara att On Error GoTo föredra framför vid hantering av fel som genereras under åtkomsten till andra objekt. Kontroll Err efter varje interaktion med ett objekt tar bort tvetydighet om vilket objekt som användes av koden. Du kan vara säker på vilket objekt som placerade felkoden i Err.Number, samt vilket objekt som ursprungligen genererade felet (objektet som anges i Err.Source).

Vid fel GoTo 0

On Error GoTo 0 inaktiverar felhantering i den aktuella proceduren. Den anger inte rad 0 som början på felhanteringskoden, även om proceduren innehåller en rad numrerad 0. Utan en On Error GoTo 0 instruktion inaktiveras en felhanterare automatiskt när en procedur avslutas.

Vid fel GoTo -1

On Error GoTo -1 inaktiverar undantaget i den aktuella proceduren. Den anger inte rad -1 som början på felhanteringskoden, även om proceduren innehåller en rad numrerad -1. Utan en On Error GoTo -1 instruktion inaktiveras ett undantag automatiskt när en procedur avslutas.

Om du vill förhindra att felhanteringskoden körs när inget fel har inträffat, placerar du en Exit Sub, Exit Functioneller Exit Property -instruktion omedelbart före felhanteringsrutinen, som i följande 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

Här följer felhanteringskoden -instruktionen Exit Sub och föregår -instruktionen End Sub för att skilja den från procedurflödet. Du kan placera felhanteringskod var som helst i en procedur.

Ohörda fel

Ohämrade fel i objekt returneras till det kontrollerande programmet när objektet körs som en körbar fil. I utvecklingsmiljön returneras ohörda fel till det kontrollerande programmet endast om rätt alternativ har angetts. I dokumentationen för värdprogrammet finns en beskrivning av vilka alternativ som ska anges under felsökningen, hur du ställer in dem och om värden kan skapa klasser.

Om du skapar ett objekt som har åtkomst till andra objekt bör du försöka hantera eventuella ohanterade fel som de skickar tillbaka. Om du inte kan mappa felkoderna Err.Number till ett av dina egna fel och skicka dem sedan tillbaka till anroparen för objektet. Du bör ange felet genom att lägga till felkoden i konstanten VbObjectError . Om din felkod till exempel är 1052 tilldelar du den på följande sätt:

Err.Number = vbObjectError + 1052

Varning

Systemfel vid anrop till Windows DLL:er (Dynamic Link Libraries) genererar inte undantag och kan inte fångas med Visual Basic-felfångst. När du anropar DLL-funktioner bör du kontrollera varje returvärde för lyckade eller misslyckade (enligt API-specifikationerna) och i händelse av ett fel kontrollerar du värdet i Err objektets LastDLLError egenskap.

Exempel

I det här exemplet används först -instruktionen On Error GoTo för att ange platsen för en felhanteringsrutin inom en procedur. I exemplet genererar ett försök att dividera med noll felnummer 6. Felet hanteras i felhanteringsrutinen och kontrollen returneras sedan till instruktionen som orsakade felet. Instruktionen On Error GoTo 0 inaktiverar felfångstning. Sedan används -instruktionen On Error Resume Next för att skjuta upp felfångstning så att kontexten för felet som genereras av nästa -instruktion kan vara känd för vissa. Observera att Err.Clear används för att rensa Err objektets egenskaper när felet har hanterats.

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

Krav

Namnområde: Microsoft.VisualBasic

Sammansättning: Visual Basic Runtime Library (i Microsoft.VisualBasic.dll)

Se även