Sdílet prostřednictvím


Try...Catch....Finally – příkaz (Visual Basic)

Umožňuje zpracovat některé nebo všechny možné chyby, které se mohou objevit v daném bloku kódu, kód stále běží.

Try
    [ tryStatements ]
    [ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
    [ catchStatements ]
    [ Exit Try ] ]
[ Catch ... ]
[ Finally
    [ finallyStatements ] ]
End Try

Části

Termín

Definice

tryStatements

Nepovinné.Příkazů, kde může dojít k chybě.Může být složený příkaz.

Catch

Nepovinné.Více Catch bloky povoleno.Pokud při zpracování dojde k výjimce Try blokovat každé Catch prohlášení je zkontrolován v pořadí textové zjistit, zda pracuje s výjimkou exception představuje výjimku, která byla vyvolána.

exception

Nepovinné.Libovolný název proměnné.Počáteční hodnota exception je hodnota thrown chyba.S Catch ulovených určit chyby.Pokud tento argument vynecháte, Catch výkazu úlovků všechny výjimky.

type

Nepovinné.Určuje typ třídy filtru.Pokud hodnota exception je určen typ type nebo odvozeného typu identifikátor vázán objekt výjimky.

When

Nepovinné.A Catch prohlášení s When klauzule úlovky výjimky pouze při expression vyhodnocen jako True.A When pouze po kontrole typ výjimky, je použita klauzule a expression mohou odkazovat na identifikátor představující výjimku.

expression

Nepovinné.Musí být implicitně převést na Boolean.Výraz, který popisuje obecný filtr.Obvykle slouží k filtrování podle čísla chyby.S When klíčové slovo určit okolnosti, za kterých je zachycena chyba.

catchStatements

Nepovinné.Příkazů pro zpracování chyb, které se vyskytují v přidružených Try bloku.Může být složený příkaz.

Exit Try

Nepovinné.Klíčové slovo, které od konce Try...Catch...Finally struktury.Spuštění návratu s kódem bezprostředně následující End Try prohlášení.Finally Prohlášení bude stále spuštěn.Není povoleno v Finally bloky.

Finally

Nepovinné.A Finally bloku je spuštěn vždy při spuštění ponechá část Try...Catch prohlášení.

finallyStatements

Nepovinné.Příkazů, které jsou spouštěny po jiných při zpracování došlo.

End Try

Ukončí Try...Catch...Finally struktury.

Poznámky

Pokud očekáváte, že určité výjimky může dojít k během určitou část kódu, vložte kód Try blokovat a použít Catch bloku udržet si kontrolu a zpracovat výjimku, pokud se vyskytuje.

A Try…Catch prohlášení tvoří Try bloku následuje jeden nebo více Catch doložky zadejte popisovače pro různé výjimky.Když je vyvolána výjimka Try blok, Visual Basic hledá Catch příkaz, který zpracovává výjimku.Pokud odpovídající Catch příkaz není nalezen, Visual Basic zkoumá metodu, která se nazývá aktuální metody nahoru zásobník volání a podobně.Pokud ne Catch bloku je nalezen, Visual Basic uživateli zobrazí zpráva neošetřené výjimky a zastaví provádění programu.

Můžete použít více než jeden Catch prohlášení v Try…Catch prohlášení.Pokud provedete tento pořadí Catch klauzule je důležité, protože jsou zkoumány v pořadí.Před ty méně specifické zachytit více specifické výjimky.

Následující Catch prohlášení podmínek nejméně specifické a zachytí všechny výjimky, které se odvozují z Exception třídy.Obvykle použijete jednu z těchto variant jako poslední Catch blokovat Try...Catch...Finally struktury po zachycení specifické výjimky očekáváte.Řízení toku nikdy dostat Catch blok, který následuje buď z těchto variant.

  • The type is Exception, for example:Catch ex As Exception

  • Příkaz nemá žádné exception proměnné, například:Catch

Při Try…Catch…Finally prohlášení je vnořen do jiného Try blok, Visual Basic nejprve prověří všechny Catch prohlášení v nejvnitřnějším Try bloku.Pokud neexistuje odpovídající Catch prohlášení je nalezen, hledání pokračuje Catch prohlášení vnější Try…Catch…Finally bloku.

Místní proměnné z Try nejsou k dispozici v bloku Catch blokovat, protože jsou samostatné bloky.Pokud chcete použít proměnnou ve více než jeden blok, deklarovat proměnnou mimo Try...Catch...Finally struktury.

Tip

Try…Catch…Finally Prohlášení je k dispozici jako fragmentu kódu pro technologie IntelliSense.Ve Správci výstřižků kódu, rozbalte kód vzorků - li pro každou, zkuste zachytit vlastnost, atda potom Chyba zpracování (výjimky).Další informace naleznete v tématu Fragmenty kódu.

Blok

Pokud máte jeden nebo více příkazů, které je třeba spustit před zavřením Try struktury, použijte Finally bloku.Předá řízení Finally blokovat těsně před odesláním z Try…Catch struktury.To platí i v případě, že vyvolá výjimku kdekoliv uvnitř Try struktury.

A Finally bloku je užitečné pro spuštěn libovolný kód, musíte provést i v případě, že existuje výjimka.Řízení je předáno Finally blok bez ohledu na způsob Try...Catch zablokovat východy.

Kód v Finally blokovat spuštění kódu dojde i v případě Return prohlášení v Try nebo Catch bloku.Z nepředá řízení Try nebo Catch blokovat odpovídajících Finally blokovat v následujících případech:

Není platný explicitně převést do spuštění Finally bloku.Převádění spuštění z Finally bloku není platný, s výjimkou prostřednictvím výjimku.

Pokud Try prohlášení neobsahuje alespoň jeden Catch blok, musí obsahovat Finally bloku.

Tip

Pokud nemáte zvláštní výjimky Using prohlášení se chová jako Try…Finally bloku a záruky likvidace zdrojů, bez ohledu na to, jak ukončit blok.To platí i při neošetřené výjimce.Další informace naleznete v tématu Using – příkaz (Visual Basic).

Výjimka Argument

Catch Bloku exception je argument instance Exception třídu nebo třídy, který je odvozen od Exception třídy.Exception Instance třídy odpovídá chybě, k níž došlo Try bloku.

Vlastnosti Exception objektu pomáhají identifikovat příčinu a místo výjimku.Například StackTrace seznamy vlastností volané metody, které vedly k výjimce, pomáhá najít, kde k chybě došlo v kódu.Messagevrátí zprávu popisující výjimku.HelpLinkVrátí odkaz přidružený soubor nápovědy.InnerExceptionVrátí Exception vrátí objekt, který způsobil výjimku aktuální, nebo Nothing Pokud není k dispozici žádné původní Exception.

Informace o používání zkuste...Výkaz úlovků

Použití Try…Catch prohlášení pouze na signál výskytu neobvyklé nebo neočekávané události.Následující důvody:

  • Zachycování výjimek při běhu vytvoří další režii a je pravděpodobně pomalejší než pre-checking, aby se zabránilo výjimky.

  • Pokud Catch bloku není správně zpracován, výjimka nemusí být hlášena správně.

  • Zpracování výjimek, bude program složitější.

Není vždy nutné Try…Catch příkaz Zkontrolovat podmínku, která pravděpodobně dojde.Následující příklad zkontroluje, zda soubor existuje před pokusem o otevření.To snižuje potřebu lovu výjimky odsunuté OpenText metoda.

Private Sub TextFileExample(ByVal filePath As String)

    ' Verify that the file exists. 
    If System.IO.File.Exists(filePath) = False Then
        Console.Write("File Not Found: " & filePath)
    Else 
        ' Open the text file and display its contents. 
        Dim sr As System.IO.StreamReader =
            System.IO.File.OpenText(filePath)

        Console.Write(sr.ReadToEnd)

        sr.Close()
    End If 
End Sub

Zajistit, že kód v Catch správně zprávu výjimky uživatelům prostřednictvím podprocesu protokolování nebo příslušné zprávy bloky.Jinak může zůstat neznámý výjimky.

Asynchronní metody

Pokud označíte metodu s asynchronní , modifikátor, můžete použít Await operátor v metodě.Prohlášení se Await operátor přeruší provádění metody až do dokončení úkolu awaited.Úkol představuje probíhající práce.Když úkol, který je spojen s Await operátor dokončení spuštění obnoví ve stejné metody.Další informace naleznete v tématu Řízení toku v asynchronních programech (C# a Visual Basic).

Vrácené asynchronní metody úkolu může končit stavu, označující, že dokončena kvůli nezpracované výjimce.Úkol může ukončit také v zrušené stavu, který vede OperationCanceledException byla vyvolána z výrazu await.Zachytit buď typ výjimky, umístěte Await výraz přiřazeného k úkolu v Try blokovat a zachytit výjimku Catch bloku.Příklad je uveden dále v tomto tématu.

Úkol může být ve stavu, protože byly odpovědné za jeho chybující více výjimek.Úkol může být například výsledek volání Task.WhenAll.Když můžete očekávat takových úloh, zachytil výjimku pouze některé z výjimek a nemůžete předpovědět, který bude výjimce.Příklad je uveden dále v tomto tématu.

Await Výraz nemůže být uvnitř Catch bloku nebo Finally bloku.

U iterátorů

Funkce iterační nebo Get přístupový objekt provádí vlastní iterace v kolekci.Iterace používá výnos příkaz vrátit každý prvek kolekce jedné najednou.Volání funkce jazyka iterační pomocí For Each...Next – příkaz (Visual Basic).

A Yield prohlášení může být uvnitř Try bloku.A Try blok, který obsahuje Yield příkaz může mít Catch blokuje a může mít Finally bloku.V části "zkuste bloky v jazyce Visual Basic" Iterátory (C# and Visual Basic) příklad.

A Yield prohlášení nemůže být uvnitř Catch bloku nebo Finally bloku.

Pokud For Each subjektu (mimo funkce iterační) vyvolá výjimku, Catch bloku v iterační funkce není spuštěn, ale Finally vykonání bloku iterační funkce.A Catch bloku funkce iterační úlovky pouze výjimky, ke kterým dochází uvnitř funkce iterační.

Částečné důvěryhodnosti situacích

V situacích částečné důvěryhodnosti, například hostitelem sdílené síťové aplikace Try...Catch...Finally nezachytí výjimky zabezpečení, ke kterým došlo před je volána metoda, která obsahuje volání.Následující příklad, když ji umístit na sdílené položce serveru a spustit zde, vznikne chyba "System.Security.SecurityException: požadavek se nezdařil." Další informace o výjimky zabezpečení naleznete SecurityException třídy.

Try
    Process.Start("https://www.microsoft.com")
Catch ex As Exception
    MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try

V takové částečné důvěryhodnosti situaci, je nutné umístit Process.Start v samostatném prohlášení Sub.Počáteční volání Sub se nezdaří.Díky Try...Catch před zachytit Sub , která obsahuje Process.Start je spuštěna a Výjimka zabezpečení.

Příklad

Následující příklad ukazuje strukturu Try...Catch...Finally prohlášení.

Public Sub TryExample()
    ' Declare variables. 
    Dim x As Integer = 5
    Dim y As Integer = 0

    ' Set up structured error handling. 
    Try 
        ' Cause a "Divide by Zero" exception.
        x = x \ y

        ' This statement does not execute because program 
        ' control passes to the Catch block when the 
        ' exception occurs.
        MessageBox.Show("end of Try block")
    Catch ex As Exception
        ' Show the exception's message.
        MessageBox.Show(ex.Message)

        ' Show the stack trace, which is a list of methods 
        ' that are currently executing.
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Finally 
        ' This line executes whether or not the exception occurs.
        MessageBox.Show("in Finally block")
    End Try 
End Sub

V následujícím příkladu CreateException vyvolá metodu NullReferenceException.Kód, který generuje výjimku není v Try bloku.Proto CreateException metoda nezpracovává výjimku.RunSample Metoda zpracovat výjimku, protože volání CreateException metoda je v Try bloku.

Příklad zahrnuje Catch příkazy pro několik typů výjimky, seřazených od nejvíce konkrétních nejvíce Obecné.

Public Sub RunSample()
    Try
        CreateException()
    Catch ex As System.IO.IOException
        ' Code that reacts to IOException. 
    Catch ex As NullReferenceException
        MessageBox.Show("NullReferenceException: " & ex.Message)
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Catch ex As Exception
        ' Code that reacts to any other exception. 
    End Try 
End Sub 

Private Sub CreateException()
    ' This code throws a NullReferenceException. 
    Dim obj = Nothing 
    Dim prop = obj.Name

    ' This code also throws a NullReferenceException. 
    'Throw New NullReferenceException("Something happened.") 
End Sub

Následující příklad ukazuje použití Catch When příkaz podmíněný výraz filtru.Pokud podmíněný výraz vyhodnocen jako True, kód Catch blokovat spuštění.

Private Sub WhenExample()
    Dim i As Integer = 5

    Try 
        Throw New ArgumentException()
    Catch e As OverflowException When i = 5
        Console.WriteLine("First handler")
    Catch e As ArgumentException When i = 4
        Console.WriteLine("Second handler")
    Catch When i = 5
        Console.WriteLine("Third handler")
    End Try 
End Sub 
' Output: Third handler

V následujícím příkladu má Try…Catch prohlášení obsažené v Try bloku.Vnitřní Catch bloku vyvolá výjimku, která má své InnerException vlastnost nastavena na původní výjimce.Vnější Catch bloku zprávy vlastní výjimky a vnitřní výjimka.

Private Sub InnerExceptionExample()
    Try 
        Try 
            ' Set a reference to a StringBuilder. 
            ' The exception below does not occur if the commented 
            ' out statement is used instead. 
            Dim sb As System.Text.StringBuilder
            'Dim sb As New System.Text.StringBuilder 

            ' Cause a NullReferenceException.
            sb.Append("text")
        Catch ex As Exception
            ' Throw a new exception that has the inner exception 
            ' set to the original exception. 
            Throw New ApplicationException("Something happened :(", ex)
        End Try 
    Catch ex2 As Exception
        ' Show the exception.
        Console.WriteLine("Exception: " & ex2.Message)
        Console.WriteLine(ex2.StackTrace)

        ' Show the inner exception, if one is present. 
        If ex2.InnerException IsNot Nothing Then
            Console.WriteLine("Inner Exception: " & ex2.InnerException.Message)
            Console.WriteLine(ex2.StackTrace)
        End If 
    End Try 
End Sub

Následující příklad ukazuje pro asynchronní metody zpracování výjimek.Zachytit výjimku, která se vztahuje k úkolu asynchronní, Await je výraz v Try bloku volajícího a výjimka je zachycen v Catch bloku.

Z komentáře Throw New Exception řádek v příkladu prokázat zpracování výjimek.Výjimce v Catch blokovat úkolu IsFaulted vlastnost Truea jeho Exception.InnerException vlastnost výjimku.

Z komentáře Throw New OperationCancelledException řádku k prokázání toho, co se stane při zrušení asynchronní proces.Výjimkou je zachycen v Catch bloku a jeho IsCanceled vlastnost True.Však za určitých podmínek, které se nevztahují na tomto příkladu IsFaulted je nastavena na True a IsCanceled je nastavena na False.

Public Async Function DoSomethingAsync() As Task
    Dim theTask As Task(Of String) = DelayAsync()

    Try 
        Dim result As String = Await theTask
        Debug.WriteLine("Result: " & result)
    Catch ex As Exception
        Debug.WriteLine("Exception Message: " & ex.Message)
    End Try

    Debug.WriteLine("Task IsCanceled: " & theTask.IsCanceled)
    Debug.WriteLine("Task IsFaulted:  " & theTask.IsFaulted)
    If theTask.Exception IsNot Nothing Then
        Debug.WriteLine("Task Exception Message: " &
            theTask.Exception.Message)
        Debug.WriteLine("Task Inner Exception Message: " &
            theTask.Exception.InnerException.Message)
    End If 
End Function 

Private Async Function DelayAsync() As Task(Of String)
    Await Task.Delay(100)

    ' Uncomment each of the following lines to 
    ' demonstrate exception handling. 

    'Throw New OperationCanceledException("canceled") 
    'Throw New Exception("Something happened.") 
    Return "Done" 
End Function 


' Output when no exception is thrown in the awaited method: 
'   Result: Done 
'   Task IsCanceled: False 
'   Task IsFaulted:  False 

' Output when an Exception is thrown in the awaited method: 
'   Exception Message: Something happened. 
'   Task IsCanceled: False 
'   Task IsFaulted:  True 
'   Task Exception Message: One or more errors occurred. 
'   Task Inner Exception Message: Something happened. 

' Output when an OperationCanceledException or TaskCanceledException 
' is thrown in the awaited method: 
'   Exception Message: canceled 
'   Task IsCanceled: True 
'   Task IsFaulted:  False

Následující příklad ukazuje zpracování výjimek, kde může být více výjimek více úkolů.Try Bloku je Await výraz pro úkol, Task.WhenAll vrátil.Úkol je dokončen, pokud tři úkoly, které Task.WhenAll je použita jsou kompletní.

Všechny tři úkoly způsobí výjimku.Catch Bloku prochází výjimek, které se nacházejí v Exception.InnerExceptions vlastnosti úlohy, Task.WhenAll vrátil.

Public Async Function DoMultipleAsync() As Task
    Dim theTask1 As Task = ExcAsync(info:="First Task")
    Dim theTask2 As Task = ExcAsync(info:="Second Task")
    Dim theTask3 As Task = ExcAsync(info:="Third Task")

    Dim allTasks As Task = Task.WhenAll(theTask1, theTask2, theTask3)

    Try
        Await allTasks
    Catch ex As Exception
        Debug.WriteLine("Exception: " & ex.Message)
        Debug.WriteLine("Task IsFaulted: " & allTasks.IsFaulted)
        For Each inEx In allTasks.Exception.InnerExceptions
            Debug.WriteLine("Task Inner Exception: " + inEx.Message)
        Next 
    End Try 
End Function 

Private Async Function ExcAsync(info As String) As Task
    Await Task.Delay(100)

    Throw New Exception("Error-" & info)
End Function 

' Output: 
'   Exception: Error-First Task 
'   Task IsFaulted: True 
'   Task Inner Exception: Error-First Task 
'   Task Inner Exception: Error-Second Task 
'   Task Inner Exception: Error-Third Task

Viz také

Referenční dokumentace

Err

Exit – příkaz (Visual Basic)

On Error – příkaz (Visual Basic)

Exception

Throw – příkaz (Visual Basic)

Koncepty

Doporučené postupy pro používání fragmentů kódu

Zpracování výjimek (Task Parallel Library)