On Error – příkaz (Visual Basic)

Umožňuje rutinu zpracování chyb a určuje umístění rutiny v rámci procedury; lze také použít k zakázání rutiny zpracování chyb. Tento On Error příkaz se používá v nestrukturovaném zpracování chyb a lze ho použít místo strukturovaného zpracování výjimek. Strukturované zpracování výjimek je integrované do .NET, je obecně efektivnější a proto se doporučuje při zpracování chyb za běhu ve vaší aplikaci.

Bez zpracování chyb nebo zpracovánívýjimekch

Poznámka:

Klíčové Error slovo se používá také v chybovém prohlášení, které je podporováno pro zpětnou kompatibilitu.

Syntaxe

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

Součástky

Pojem definice
GoTořádek Povolí rutinu zpracování chyb, která začíná na řádku zadaném v argumentu požadovaného řádku . Argument řádku je jakýkoli popisek řádku nebo číslo řádku. Pokud dojde k chybě za běhu, řídí větve na zadaný řádek, aby obslužná rutina chyby byla aktivní. Zadaný řádek musí být ve stejném postupu jako příkaz On Error nebo dojde k chybě v době kompilace.
GoTo 0 Zakáže povolenou obslužnou rutinu chyby v aktuálním postupu a resetuje ji na Nothing.
GoTo -1 Zakáže povolenou výjimku v aktuálním postupu a resetuje ji na Nothing.
Resume Next Určuje, že když dojde k chybě za běhu, ovládací prvek přejde na příkaz bezprostředně za příkazem, kde došlo k chybě, a provádění pokračuje od tohoto bodu. Tento formulář použijte místo On Error GoTo při přístupu k objektům.

Poznámky

Poznámka:

Pokud je to možné, doporučujeme ve svém kódu používat strukturované zpracování výjimek místo použití nestrukturovaného zpracování výjimek a příkazu On Error . Další informace naleznete v tématu Vyzkoušet... Chytit... Příkaz Finally.

Obslužná rutina chyby s povolenou je ta, která je zapnutá příkazem On Error . Obslužná rutina chyby "aktivní" je povolená obslužná rutina, která je v procesu zpracování chyby.

Pokud dojde k chybě, když je obslužná rutina chyby aktivní (mezi výskytem chyby a příkazem Resume, Exit Sub, Exit Functionnebo příkazem Exit Property ), obslužná rutina chyby aktuální procedury nemůže chybu zpracovat. Ovládací prvek se vrátí do volající procedury.

Pokud má volající procedura povolenou obslužnou rutinu chyby, aktivuje se pro zpracování chyby. Pokud je obslužná rutina chyby volající procedury také aktivní, ovládací prvek předává zpět předchozí volající procedury, dokud se nenajde aktivní, ale neaktivní obslužná rutina chyby. Pokud se nenajde žádná taková obslužná rutina chyby, chyba je závažná v okamžiku, kdy k ní skutečně došlo.

Pokaždé, když obslužná rutina chyby předá řízení zpět volající procedurě, tento postup se stane aktuální procedurou. Po zpracování chyby obslužnou rutinou chyby v libovolném postupu se provádění obnoví v aktuálním postupu v bodě určeném příkazem Resume .

Poznámka:

Rutina zpracování chyb není procedura Sub ani procedura Function . Jedná se o oddíl kódu označený popiskem řádku nebo číslem řádku.

Number – vlastnost

Rutiny zpracování chyb spoléhají na hodnotu ve Number vlastnosti Err objektu k určení příčiny chyby. Rutina by měla testovat nebo ukládat relevantní hodnoty vlastností v objektu Err předtím, než může dojít k jakékoli jiné chybě nebo před procedurou, která by mohla způsobit chybu. Hodnoty vlastností v objektu Err odrážejí pouze nejnovější chybu. Chybová zpráva přidružená Err.Number je obsažena v Err.Description.

Throw – příkaz

Chyba vyvolaná metodou Err.Raise nastaví Exception vlastnost na nově vytvořenou Exception instanci třídy. Aby bylo možné podporovat vyvolání výjimek odvozených typů výjimek, Throw je v jazyce podporován příkaz. To přebírá jeden parametr, který je instance výjimky, která má být vyvolán. Následující příklad ukazuje, jak lze tyto funkce použít s existující podporou zpracování výjimek:

    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

Všimněte si, že příkaz On Error GoTo vystihne všechny chyby bez ohledu na třídu výjimky.

Při dalším obnovení chyby

On Error Resume Next způsobí, že provádění bude pokračovat s příkazem bezprostředně za příkazem, který způsobil chybu za běhu, nebo s příkazem bezprostředně za posledním voláním procedury obsahující příkaz On Error Resume Next . Tento příkaz umožňuje pokračovat spuštěním i přes chybu za běhu. Rutinu zpracování chyb můžete umístit místo přenosu ovládacího prvku do jiného umístění v rámci postupu. Příkaz On Error Resume Next se stane neaktivní, pokud je volána jiná procedura, takže byste měli provést On Error Resume Next příkaz v každé volané rutině, pokud chcete v rámci této rutiny zpracovat vložené chyby.

Poznámka:

Konstruktor On Error Resume Next může být vhodnější než On Error GoTo při zpracování chyb generovaných při přístupu k jiným objektům. Kontrola Err po každé interakci s objektem odebere nejednoznačnost, ke kterému objektu přistupoval kód. Můžete si být jisti, který objekt umístil kód chyby do Err.Number, a také objekt, který původně vygeneroval chybu (objekt zadaný v Err.Source).

Při chybě Přejít na 0

On Error GoTo 0 zakáže zpracování chyb v aktuálním postupu. Jako začátek kódu pro zpracování chyb neurčuje řádek 0, a to ani v případě, že procedura obsahuje řádek číslovaný 0. On Error GoTo 0 Bez příkazu je obslužná rutina chyby při ukončení procedury automaticky zakázána.

Při chybě Přejít na -1

On Error GoTo -1 zakáže výjimku v aktuálním postupu. Nezadá řádek -1 jako začátek kódu zpracování chyb, i když procedura obsahuje řádek číslovaný -1. On Error GoTo -1 Bez příkazu je výjimka při ukončení procedury automaticky zakázána.

Chcete-li zabránit spuštění kódu zpracování chyb, pokud nedošlo k žádné chybě, umístěte Exit SubExit Functionpřed rutinu zpracování chyb , nebo Exit Property příkaz bezprostředně před rutinu zpracování chyb, jako v následujícím fragmentu:

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

Kód pro zpracování chyb se tady řídí příkazem Exit Sub a předchází ho End Sub , aby ho oddělil od toku procedury. Kód pro zpracování chyb můžete umístit kamkoli do procedury.

Neupravené chyby

Neupravené chyby v objektech se vrátí řídicí aplikaci, když je objekt spuštěn jako spustitelný soubor. V rámci vývojového prostředí se do řídicí aplikace vrátí chyby, které nejsou v pořádku, pouze pokud jsou nastaveny správné možnosti. V dokumentaci k hostitelské aplikaci najdete popis možností, které by se měly nastavit při ladění, jak je nastavit a jestli hostitel může vytvářet třídy.

Pokud vytvoříte objekt, který přistupuje k jiným objektům, měli byste zkusit zpracovat všechny neošetřené chyby, které předávají zpět. Pokud nemůžete, namapujte kódy Err.Number chyb na jednu z vlastních chyb a pak je předejte zpět volajícímu objektu. Chybu byste měli zadat přidáním kódu chyby do konstanty VbObjectError . Pokud je například kód chyby 1052, přiřaďte ho následujícím způsobem:

Err.Number = vbObjectError + 1052

Upozornění

Systémové chyby při volání knihoven DLL (Dynamic Link) systému Windows nevyvolají výjimky a nelze je zachytnout pomocí zachytávání chyb jazyka Visual Basic. Při volání funkcí knihovny DLL byste měli zkontrolovat každou návratovou hodnotu pro úspěch nebo selhání (podle specifikací rozhraní API) a v případě selhání zkontrolujte hodnotu ve vlastnosti objektu Err LastDLLError .

Příklad

Tento příklad nejprve používá On Error GoTo příkaz k určení umístění rutiny zpracování chyb v rámci procedury. V příkladu se pokus o dělení nulou vygeneruje číslo chyby 6. Tato chyba se zpracovává v rutině zpracování chyb a ovládací prvek se vrátí do příkazu, který chybu způsobil. Příkaz On Error GoTo 0 vypne zachytávání chyb. On Error Resume Next Příkaz se pak používá k odvozování soutisku chyb tak, aby byl kontext chyby vygenerovaný dalším příkazem znám pro určité. Všimněte si, že Err.Clear slouží k vymazání Err vlastností objektu po zpracování chyby.

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

Požadavky

Obor názvů: Microsoft.VisualBasic

Sestavení: Visual Basic Runtime Library (v Microsoft.VisualBasic.dll)

Viz také