Přehled strukturovaného zpracování výjimek pro jazyk Visual Basic

Visual Basic podporuje strukturované zpracování výjimek, které lze použít k vytvoření a udržování programu s robustními a komplexními obslužnými rutinami pro chyby. Strukturované zpracování vyjímek je kód určený k rozpoznání a reakci na chyby během spuštění pomocí kombinování struktury řízení (podobně jako Select Case nebo While) s výjimkami, chráněnými bloky kódu a filtry.

Pomocí příkazů Try...Catch...Finally, je možné chránit bloky kódu, které mají potenciál k vyvolání chyby. Můžete vnořovat obslužné rutiny vyjímky a proměnné deklarované v každém bloku budou mít místní rozsah.

odkaz na video Pro související video, jděte na Jak dělám: E-mail neošetřené výjimky?.

Příkazy Try...Catch....Finally

Následující kód ukazuje strukturu příkazů Try...Catch...Finally.

Try
    ' Starts a structured exception handler.
    ' Place executable statements that may generate 
    ' an exception in this block.
Catch '[optional filters]
    ' This code runs if the statements listed in 
    ' the Try block fail and the filter on the Catch statement is true.
'[Additional Catch blocks]
Finally
    ' This code always runs immediately before
    ' the Try statement exits.
End Try
' Ends a structured exception handler.

Blok Try z obslužná rutiny Try...Catch...Finallyobsahuje oddíl kódu, který má být sledován pro výjimky. Pokud dojde k chybě v průběhu provádění tohoto oddílu, Visual Basic zkontroluje každý příkaz Catchv rámci Try...Catch...Finally dokud nenalezne podmínku, která odpovídá chybě. Pokud je nějaká nalezena, ovládání se přenese do prvního řádku kódu v bloku Catch. Pokud nebyl nalezen odpovídající příkaz Catch, vyhledávání pokračuje do příkazu Catch ve vnějším bloku Try...Catch...Finally, který obsahuje blok ve které výjimka nastala. Tento proces pokračuje přes celý zásobník dokud nedojde k nalezení Catch blok v aktuální proceduře. Pokud není nalezena žádná shoda, je vytvořena chyba.

Kód v oddílu Finally bude vždy provede jako poslední těsně před tím, než dojde k vyskočení z bloku zpracování chyb, bez ohledu na to zda kód v bloku Catch byl proveden. Umístěte čistící kód , jako je například zavření souborů a uvolnění objektů do sekce Finally. Pokud není nutné zachycovat vyjímky, ale chcete pouze provést vyčistění prostředků, zvažte použití příkazu Using, spíše než sekce Finally. Další informace naleznete v tématu Using Statement (Visual Basic).

Chybné filtrování v Catch bloku

Catch bloky dovolují tři možnosti pro specifické filtrování chyb. V prvním z nich je filtrování chyb založeno na třídě výjimky (v tomto případu ClassLoadException), stejně jak je ukázáno v následujícím kódu.

Try
    ' "Try" block.
Catch e as ClassLoadException
    ' "Catch" block.
Finally
    ' "Finally" block.
End Try

Pokud dojde k chybě ClassLoadException, je proveden kód v rámci zadaného bloku Catch.

V případě druhé možnosti filtrování chyby, oddíl Catch můžete filtrovat pomocí jakékoli podmínky. Jedno obecné použití tohoto typu Catch filtru je k testování čísla chyby, jak ukazuje následující kód.

Try
   ' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
   ' "Catch" block.
Finally
   ' "Finally" block.
End Try

V případě, že Visual Basic nalezne odpovídající obslužnou rutinu, spustí kód v rámci této obslužné rutiny a potom předá ovládání do bloku Finally.

Poznámka

Při pokusech o nalezení bloku Catch pro zpracování výjimky, je vyhodnocen každý blok popisovače, dokud není nalezena shoda. Protože tyto popisovače mohou být volání funkcí, může dojít k neočekávaným vedlejším účinkům; jako například volání může změnit veřejnou proměnnou, která se používána v kódu u různých Catch bloků, který končí zpracování výjimek.

Třetí alternativou je možnost seskupení možnosti 1 a 2, použití obojího pro zpracování výjimek. Vaš příkaz Catch by měl přecházet z nejvíce specifických do obecnějších. Blok Catch sám zachytí všechny výjimky odvozené z Exception a proto by měl být vždy umístěn jako poslední blok před Finally.

Vyskočení mimo blok Try…Catch

Je možné vyskočit z bloku Catch zpět do původního příkazu Try nebo příkazu End Try, ale není možné vyskočit do bloku Try…Catch. Toto je znázorněno zde:

Větvení konstrukce Try Catch

Příklad strukturovaného zpracování vyjímek

Následující příklad ukazuje jiné jednoduché zpracování chyby, které používá příkaz Try...Catch...Finally.

Option Strict On
Imports System.IO

Module Module1
    Private Const FileName As String = "TestFile.data"

    Public Sub Main()

        ' First, create a new data file and write some data to the file.
        ' 1. Create the new, empty data file.
        If File.Exists(FileName) Then
            File.Delete(FileName)
        End If
        Dim fs As New FileStream(FileName, FileMode.CreateNew)

        ' 2. Create a BinaryWriter object for the data.
        Dim writer As New BinaryWriter(fs)

        ' 3. Write some sample data to the file.
        For i = 0 To 10
            writer.Write(i)
        Next i
        writer.Close()
        fs.Close()

        ' Now read from the file you just made.
        ' 1. Create a BinaryReader object for the data stream.
        fs = New FileStream(FileName, FileMode.Open, FileAccess.Read)
        Dim reader As New BinaryReader(fs)

        ' 2. Read data from TestFile.data. The loop terminates with an
        ' EndOfStreamException when an attempt is made to read past
        ' the end of the stream.
        Try
            ' This loop terminates with an EndOfStreamException when it 
            ' reaches the end of the stream.
            While True
                Console.WriteLine(reader.ReadInt32())
            End While
            Console.WriteLine("The data was read with no error.")
        ' 3. Report the first error that is caught, if there is one.
        Catch eosExcep As EndOfStreamException
            ' This Catch block is executed when the reader attempts
            ' to read past the end of the stream.
            Console.WriteLine("End-of-stream exception occurred.")
        Catch IOExcep As System.IO.IOException
            ' For this Catch block, some other error occurred before
            ' the end of stream was reached. Print the standard
            ' exception message.
            Console.WriteLine(IOExcep.Message)
        Finally
            ' The Finally block is always executed.
            Console.WriteLine("Executing the Finally block.")
            reader.Close()
            fs.Close()
        End Try
    End Sub

End Module

Blok Finallyje vždy spuštěn, bez ohledu na jakékoli akce, které se vyskytují v předcházejících blocích Catch. V strukturovaném zpracování vyjímek nelze použít Resume nebo Resume Next.

Poznámka

V předchozím příkladu, jakákoliv jiná výjimka než třída IOException nebo EndOfStreamException je nezpracována propagována zpět k volajícímu.

Viz také

Úkoly

Poradce při potížích s výjimkou zpracování (Visual Basic)

Odkaz

Try...Catch...Finally Statement (Visual Basic)

BinaryReader

BinaryWriter

FileStream

Koncepty

Úvod do zpracování (Visual Basic) výjimek

Typy chyb (Visual Basic)

Nestrukturovaný přehled (Visual Basic) zpracování výjimek

Další zdroje

Úkoly (Visual Basic) zpracování výjimek