Hibautasításon (Visual Basic)

Lehetővé teszi a hibakezelési rutint, és meghatározza a rutin helyét egy eljáráson belül; hibakezelési rutin letiltására is használható. Az On Error utasítás strukturálatlan hibakezelésben használatos, és strukturált kivételkezelés helyett használható. A strukturált kivételkezelés a .NET-be van beépítve, általában hatékonyabb, ezért ajánlott az alkalmazás futásidejű hibáinak kezelésekor.

Hibakezelés vagy kivételkezelés nélkül az esetleges futásidejű hibák végzetesek: hibaüzenet jelenik meg, és a végrehajtás leáll.

Feljegyzés

A Error kulcsszót a hibakimutatásban is használják, amely a visszamenőleges kompatibilitás szempontjából támogatott.

Syntax

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

Részek

Időszak Definíció
GoToVonal Engedélyezi a hibakezelési rutint, amely a szükséges sorargumentumban megadott sorban kezdődik. A sorargumentum bármilyen vonalcímke vagy sorszám. Futásidejű hiba esetén a megadott sor ágainak vezérlése aktívvá teszi a hibakezelőt. A megadott sornak ugyanabban az eljárásban kell lennie, mint az On Error utasításnak, vagy fordítási időre vonatkozó hiba történik.
GoTo 0 Letiltja az engedélyezett hibakezelőt az aktuális eljárásban, és visszaállítja a következőre Nothing: .
GoTo -1 Letiltja az engedélyezett kivételt az aktuális eljárásban, és visszaállítja azt a következőre Nothing: .
Resume Next Azt adja meg, hogy futásidejű hiba esetén a vezérlés közvetlenül azt az utasítást követő utasításra kerül, ahol a hiba történt, és a végrehajtás ettől a ponttól folytatódik. Használja ezt az űrlapot az objektumok elérése helyett On Error GoTo .

Megjegyzések

Feljegyzés

Javasoljuk, hogy strukturált kivételkezelést használjon a kódban, amikor csak lehetséges, ne strukturálatlan kivételkezelést és utasítást On Error használjon. További információ: Kipróbálás... Fogás... Végül nyilatkozat.

Az "engedélyezett" hibakezelő egy utasítás által On Error bekapcsolt hibakezelő. Az "aktív" hibakezelő egy olyan engedélyezett kezelő, amely egy hiba kezelésének folyamatában van.

Ha hiba történik, miközben egy hibakezelő aktív (a hiba előfordulása és egy Resume, Exit Sub, Exit Functionvagy Exit Property utasítás között), az aktuális eljárás hibakezelője nem tudja kezelni a hibát. A vezérlő visszatér a hívási eljáráshoz.

Ha a hívási eljárás rendelkezik engedélyezett hibakezelő használatával, a hiba kezeléséhez aktiválódik. Ha a hívási eljárás hibakezelője is aktív, a vezérlő a korábbi hívási eljárásokon halad át, amíg egy engedélyezett, de inaktív hibakezelő nem található. Ha nem található ilyen hibakezelő, a hiba végzetes abban a pillanatban, amikor ténylegesen bekövetkezett.

Minden alkalommal, amikor a hibakezelő átadja az irányítást egy hívási eljárásnak, ez lesz az aktuális eljárás. Ha egy hibakezelő bármilyen eljárásban hibát kezel, a végrehajtás folytatódik az aktuális eljárásban az utasítás által Resume kijelölt ponton.

Feljegyzés

A hibakezelési rutin nem Sub eljárás vagy Function eljárás. Ez egy kódszakasz, amelyet vonalcímkével vagy sorszámmal jelölnek meg.

Szám tulajdonság

A hibakezelési rutinok az objektum tulajdonságában Err lévő Number értékre támaszkodnak a hiba okának meghatározásához. A rutinnak tesztelnie vagy mentenie kell a megfelelő tulajdonságértékeket az Err objektumban, mielőtt bármilyen más hiba következne be, vagy mielőtt egy olyan eljárást hívna meg, amely hibát okozhat. Az objektum tulajdonságértékei Err csak a legutóbbi hibát tükrözik. A társított Err.Number hibaüzenet a következőben Err.Descriptiontalálható: .

Dobás utasítás

A metódus által kiváltott hiba az Err.RaiseException osztály újonnan létrehozott példányára állítja a Exception tulajdonságot. A származtatott kivételtípusok Throw kivételeinek növelése érdekében a nyelv egy utasítást támogat. Ez egyetlen paramétert vesz igénybe, amely a kivételpéldány. Az alábbi példa bemutatja, hogyan használhatók ezek a funkciók a meglévő kivételkezelési támogatással:

    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

Figyelje meg, hogy az utasítás a On Error GoTo kivételosztálytól függetlenül az összes hibát csapdába ejti.

A következő folytatáskor megjelenő hiba

On Error Resume Next a végrehajtás a futási időt okozó utasítást közvetlenül követő utasítással folytatódik, vagy az utasítást közvetlenül az utasítást tartalmazó On Error Resume Next eljárás legutóbbi meghívását követő utasítással. Ez az utasítás lehetővé teszi a végrehajtás folytatását futásidejű hiba ellenére. A hibakezelési rutint elhelyezheti úgy, hogy a hiba ahelyett, hogy átvinné az irányítást egy másik helyre az eljáráson belül. Egy On Error Resume Next utasítás inaktívvá válik egy másik eljárás meghívásakor, ezért minden egyes úgynevezett rutinban végre kell hajtania egy On Error Resume Next utasítást, ha beágyazott hibakezelést szeretne végezni a rutinon belül.

Feljegyzés

A On Error Resume Next szerkezet előnyösebb lehet a On Error GoTo más objektumokhoz való hozzáférés során keletkező hibák kezelésekor. Az objektumokkal végzett minden interakció után végzett ellenőrzés Err nem egyértelmű, hogy melyik objektumhoz fért hozzá a kód. Biztos lehet abban, hogy melyik objektum helyezte el a hibakódot Err.Number, valamint azt, hogy melyik objektum hozta létre eredetileg a hibát (a megadott objektumban Err.Source).

GoTo 0 hiba

On Error GoTo 0 letiltja a hibakezelést az aktuális eljárásban. Nem adja meg a 0. sort a hibakezelési kód kezdeteként, még akkor sem, ha az eljárás 0 sorszámú sort tartalmaz. On Error GoTo 0 Utasítás nélkül a hibakezelő automatikusan le lesz tiltva egy eljárás kilépésekor.

GoTo -1 hiba

On Error GoTo -1 letiltja a kivételt az aktuális eljárásban. A hibakezelési kód kezdeteként nem adja meg a -1 sort, még akkor sem, ha az eljárás egy -1 sorszámú sort tartalmaz. On Error GoTo -1 Utasítás nélkül a kivétel automatikusan le lesz tiltva egy eljárás kilépésekor.

Ha meg szeretné akadályozni, hogy hiba nélkül fusson a hibakezelő kód, helyezzen el egy Exit Sub, vagy Exit FunctionExit Property utasítást közvetlenül a hibakezelési rutin előtt, ahogyan az a következő töredékben látható:

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

Itt a hibakezelési kód az Exit Sub utasítást követi, és az End Sub utasítást megelőzve elválasztja azt az eljárásfolyamattól. A hibakezelő kódot bárhol elhelyezheti egy eljárásban.

Nem megfeleltetett hibák

Ha az objektum végrehajtható fájlként fut, az objektumok nem leképezett hibáit a rendszer visszaadja a vezérlő alkalmazásnak. A fejlesztési környezetben a rendszer csak akkor adja vissza a nem leképezett hibákat a vezérlő alkalmazásnak, ha a megfelelő beállítások be vannak állítva. A gazdaalkalmazás dokumentációjában megtudhatja, hogy a hibakeresés során mely beállításokat kell megadni, hogyan állíthatja be őket, és hogy a gazdagép létrehozhat-e osztályokat.

Ha olyan objektumot hoz létre, amely más objektumokhoz fér hozzá, próbálja meg kezelni az általuk visszaadott nem kezelt hibákat. Ha nem, képezheti le a hibakódokat Err.Number a saját hibái egyikére, majd adja vissza őket az objektum hívójának. A hibát úgy kell megadnia, hogy hozzáadja a hibakódot az VbObjectError állandóhoz. Ha például a hibakód 1052, rendelje hozzá az alábbiak szerint:

Err.Number = vbObjectError + 1052

Figyelemfelhívás

A windowsos dinamikus csatolású kódtárak (DLL-ek) hívásai során előforduló rendszerhibák nem okoznak kivételeket, és nem zárhatók be Visual Basic-hibabetöltéssel. A DLL-függvények meghívásakor ellenőriznie kell az egyes visszatérési értékeket a sikeresség vagy a hiba szempontjából (az API-specifikációknak megfelelően), és hiba esetén ellenőrizze az Err objektum LastDLLError tulajdonságában lévő értéket.

Példa

Ez a példa először az On Error GoTo utasítással határozza meg egy hibakezelési rutin helyét egy eljáráson belül. A példában a nullával való osztási kísérlet 6-os hibaszámot eredményez. A hiba kezelése a hibakezelési rutinban történik, majd a rendszer visszaadja a vezérlést a hibát okozó utasításnak. Az On Error GoTo 0 utasítás kikapcsolja a hibabetöltést. Ezután az utasítás a On Error Resume Next hibabetöltés elhalasztására szolgál, hogy a következő utasítás által generált hiba kontextusa biztosan ismert legyen. Vegye figyelembe, hogy Err.Clear a hiba kezelése után az Err objektum tulajdonságainak törlésére szolgál.

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

Követelmények

Névtér:Microsoft.VisualBasic

Szerelvény: Visual Basic Runtime Library (Microsoft.VisualBasic.dll)

Lásd még