On Error – příkaz (Visual Basic)

Povoluje 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. On ErrorPříkaz se používá při zpracování nestrukturovaných chyb a lze jej použít namísto strukturovaného zpracování výjimek. Strukturované zpracování výjimek je integrováno do .NET, je obecně efektivnější, a proto se doporučuje při zpracování běhových chyb v aplikaci.

Bez zpracování chyb nebo zpracování výjimek by jakákoli chyba za běhu, ke které dochází, je závažná: zobrazí se chybová zpráva a běh se zastaví.

Poznámka

ErrorKlíčové slovo se používá také v příkazu Error, který je podporovaný z důvodu zpětné kompatibility.

Syntax

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

Součásti

Pojem Definice
GoTočára Povoluje rutinu zpracování chyb, která začíná na řádku zadaném v argumentu Required. Argument line je libovolný řádek popisku nebo čísla řádku. Pokud dojde k chybě za běhu, ovládací prvky se řídí na zadaný řádek, čímž se aktivuje obslužná rutina chyb. Zadaný řádek musí být ve stejné proceduře jako On Error příkaz nebo dojde k chybě při kompilaci.
GoTo 0 Zakáže povolenou obslužnou rutinu chyb v aktuální proceduře a obnoví ji na Nothing .
GoTo -1 Zakáže povolenou výjimku v aktuální proceduře a obnoví ji na Nothing .
Resume Next Určuje, že pokud dojde k chybě za běhu, řízení přejde na příkaz ihned po příkazu, kde došlo k chybě, a provádění pokračuje od tohoto bodu. Použijte tento formulář místo toho On Error GoTo , abyste měli přístup k objektům.

Poznámky

Poznámka

Doporučujeme používat strukturované zpracování výjimek v kódu, kdykoli je to možné, místo použití nestrukturovaného zpracování výjimek a On Error příkazu. Další informace najdete v tématu Try... Zachytit... Finally – příkaz.

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

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

Pokud volající procedura má povolenou obslužnou rutinu chyb, je aktivována, aby zpracovala chybu. Pokud je obslužná rutina chyby volajícího procesu také aktivní, řízení projde předchozími volajícími procedurami, dokud není povolena, ale neaktivní obslužná rutina chyby. Pokud tato obslužná rutina chyb nenajde, je chyba závažná v okamžiku, kdy k ní došlo.

Pokaždé, když obslužná rutina chyby předá řízení zpět do volající procedury, tato procedura se stal aktuálním postupem. Jakmile je chyba zpracována obslužnou rutinou chyby v jakémkoli postupu, provádění pokračuje v aktuální proceduře v místě určeném Resume příkazem.

Poznámka

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

Číselná vlastnost

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

Throw – příkaz

Chyba, která je vyvolána metodou, Err.Raise nastaví Exception vlastnost na nově vytvořenou instanci Exception třídy. Aby bylo možné podporovat vyvolávání výjimek odvozených typů výjimek, Throw je příkaz podporován v jazyce. To přijímá jeden parametr, který je instancí výjimky, která má být vyvolána. 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 On Error GoTo příkaz provádí depeše všech chyb bez ohledu na třídu výjimek.

Při chybě obnovit další

On Error Resume Next způsobí, že provádění pokračuje s příkazem hned po příkazu, který způsobil chybu za běhu, nebo s příkazem hned za posledním voláním metody, která obsahuje On Error Resume Next příkaz. Tento příkaz umožňuje, aby provádění pokračovalo navzdory chybě v době běhu. Můžete umístit rutinu pro zpracování chyb, kde by došlo k chybě místo přenosu řízení do jiného umístění v rámci postupu. On Error Resume NextPříkaz se neaktivuje, pokud je volána jiná procedura, takže byste měli provést On Error Resume Next příkaz v každé rutině s názvem, pokud chcete v rámci této rutiny zpracovat vložené chyby.

Poznámka

On Error Resume NextKonstrukce může být vhodnější 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 o tom, který objekt byl získán pomocí kódu. Můžete si být jisti, který objekt umístil kód chyby v Err.Number , a také objekt původně vygeneroval chybu (objekt určený v Err.Source ).

Při chybě GoTo 0

On Error GoTo 0 Zakáže zpracování chyb v aktuální proceduře. Nespecifikuje řádek 0 jako začátek kódu pro zpracování chyb, a to i v případě, že procedura obsahuje řádek s číslem 0. Bez On Error GoTo 0 příkazu je obslužná rutina chyby automaticky zakázána při ukončení procedury.

Při chybě GoTo-1

On Error GoTo -1 zakáže výjimku v aktuální proceduře. Neurčuje řádek-1 jako začátek kódu pro zpracování chyb, a to i v případě, že procedura obsahuje řádek s číslem 1. Bez On Error GoTo -1 příkazu je výjimka automaticky zakázána při ukončení procedury.

Chcete-li zabránit spuštění kódu pro zpracování chyb, pokud nedošlo k žádné chybě, umístěte Exit Sub Exit Function příkaz, nebo Exit Property těsně 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

Zde je kód pro ošetření chyb Exit Sub následován příkazem a předchází End Sub příkazu k oddělení od toku procedury. Kód pro zpracování chyb lze umístit kdekoli v proceduře.

Nepřesahovat chyby

Nezachycené chyby v objektech se vrátí do řídicí aplikace, když je objekt spuštěn jako spustitelný soubor. V rámci vývojového prostředí se chyby bez přesahů vrátí do řídicí aplikace pouze v případě, že jsou nastaveny správné možnosti. Popis možností nastavení, které by měly být nastaveny během ladění, jak je nastavit a zda může hostitel vytvořit třídy, najdete v dokumentaci hostitelské aplikace.

Vytvoříte-li objekt, který přistupuje k jiným objektům, měli byste se pokusit zpracovat jakékoli neošetřené chyby, které přejdou zpět. Pokud nemůžete, namapujte kódy chyb v nástroji Err.Number na jednu z vašich vlastních chyb a pak je předejte volajícímu objektu. Tuto chybu byste měli zadat tak, že do konstanty přidáte kód chyby VbObjectError . Například pokud kód chyby je 1052, přiřaďte ho následujícím způsobem:

Err.Number = vbObjectError + 1052

Upozornění

systémové chyby během volání Windows knihovny dll (dynamic link library) nevyvolávají výjimky a nelze je zachytávání pomocí Visual Basic soutisku chyb. Při volání funkcí knihoven DLL byste měli kontrolovat každou vrácenou hodnotu pro úspěch nebo neúspěch (podle specifikací rozhraní API) a v případě selhání kontrolovat hodnotu Err LastDLLError vlastnosti objektu.

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 při pokusu o dělení nulou vygeneruje chybová zpráva číslo 6. Chyba je zpracována v rutině zpracování chyb a ovládací prvek je poté vrácen do příkazu, který způsobil chybu. On Error GoTo 0Příkaz vypne soutisk chyb. Pak On Error Resume Next příkaz slouží k odložení soutisku chyb, takže kontext pro chybu vygenerovanou dalším příkazem může být pro některé z nich známý. Všimněte si, že Err.Clear se Err po zpracování chyby používá k vymazání vlastností objektu.

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

Assembly: Visual Basic knihovna Runtime (v Microsoft.VisualBasic.dll)

Viz také