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ó |
---|---|
GoTo vonal |
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... Elkap... 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 Function
vagy 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.Description
található: .
Dobás utasítás
A metódus által kiváltott hiba az Err.Raise
Exception
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 Function
Exit 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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: