Udostępnij za pośrednictwem


Try...Catch...Finally — Instrukcja (Visual Basic)

Zapewnia sposób obsługi niektórych lub wszystkich możliwych błędów, które mogą występować w bloku kodu, podczas gdy nadal uruchomiony kod.

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

Części

Termin

Definicja

tryStatements

Opcjonalne.Liczba zapytań: gdzie może wystąpić błąd.Może być złożone wyrażenie.

Catch

Opcjonalne.Wiele Catch bloków dozwolone.Jeśli wystąpi wyjątek podczas przetwarzania Try blokowanie każdego Catch instrukcji jest badany w kolejności tekstowy do ustalenia, czy obsługuje wyjątek, z exception reprezentujących wyjątek, który został wygenerowany.

exception

Opcjonalne.Nazwa zmiennej.Początkowa wartość exception jest wartością błędu thrown.Używane z Catch do określenia błędu złowionych.Jeśli pominięta, Catch instrukcji połowy każdy wyjątek.

type

Opcjonalne.Określa typ klasy filtra.Jeśli wartość exception jest typu określonej przez type lub pochodnych typu identyfikator staje się powiązany obiekt wyjątku.

When

Opcjonalne.A Catch instrukcji z When klauzuli połowy wyjątki tylko wtedy, gdy expression wynikiem True.A When tylko po sprawdzanie typ wyjątku, stosowana jest klauzula i expression może odnosić się do identyfikatora reprezentująca wyjątek.

expression

Opcjonalne.Musi być jawnie konwertowany na Boolean.Dowolne wyrażenie filtru rodzajowego.Zazwyczaj używane do filtrowania według numer błędu.Używane z When kluczowe określenie okoliczności, na których złowione jest błąd.

catchStatements

Opcjonalne.Liczba zapytań: do obsługi błędów występujących w skojarzonym Try bloku.Może być złożone wyrażenie.

Exit Try

Opcjonalne.Słowo kluczowe, które dzieli się z Try...Catch...Finally struktury.Wznawia wykonywanie kodu, niezwłocznie po End Try instrukcji.Finally Instrukcji nadal będzie wykonywany.Nie są dozwolone w Finally bloków.

Finally

Opcjonalne.A Finally bloku jest zawsze wykonywana, gdy wykonywanie opuszcza jakiejkolwiek części Try...Catch instrukcji.

finallyStatements

Opcjonalne.Liczba zapytań:, które są wykonywane po innych przetwarzania błąd wystąpił.

End Try

Kończy Try...Catch...Finally struktury.

Uwagi

Jeśli oczekujesz, że szczególne wyjątków mogą wystąpić podczas określoną sekcję kodu, należy umieocić kod Try zablokować i używać Catch bloku, aby zachować kontrolę i obsłużyć wyjątek, jeśli występuje.

A Try…Catch instrukcji składa się z Try bloku następuje jeden lub więcej Catch klauzule Określ obsługę różnych wyjątki.Gdy wyjątek jest w Try bloku, Visual Basic szuka Catch instrukcji, która obsługuje wyjątek.Jeśli pasującego Catch instrukcja nie zostanie znaleziony, Visual Basic analizuje wywołano metodę bieżącej, i tak dalej na górę stosu wywołań metody.Jeśli nie Catch blok zostanie znaleziony, Visual Basic wyświetla komunikat nieobsługiwany wyjątek dla użytkownika i zatrzymuje wykonywanie programu.

Można użyć więcej niż jednej Catch instrukcji w Try…Catch instrukcji.Spowoduje to kolejność Catch klauzul jest znaczący, ponieważ badane są w kolejności.Bardziej szczegółowe wyjątki połowu przed mniej konkretne.

Następujące Catch instrukcji warunki specyficzne co najmniej i przechwytywać wszystkie wyjątki, które wynikają z Exception klasy.Należy zwykle używać jednego z tych zmian ostatnio Catch zablokować Try...Catch...Finally struktury po przechwytywanie wyjątków specyficznych oczekujesz.Przepływ sterowania nigdy nie może osiągnąć Catch bloku, który następuje albo tych zmian.

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

  • Instrukcja nie exception zmiennej, na przykład:Catch

Gdy Try…Catch…Finally instrukcji jest zagnieżdżony w innym Try bloku, Visual Basic najpierw sprawdza każdy Catch instrukcji w skrajnym polu Try bloku.Jeśli brak odpowiedniego Catch znajduje się instrukcja, wyszukiwanie przechodzi do Catch instrukcji zewnętrznego Try…Catch…Finally bloku.

Zmienne lokalne z Try nie są dostępne w bloku Catch zablokować, ponieważ są one osobne bloki.Jeśli chcesz użyć zmiennej w więcej niż jeden blok zadeklarować zmienną poza Try...Catch...Finally struktury.

PoradaPorada

Try…Catch…Finally Instrukcja jest dostępna jako urywek kodu IntelliSense.W Menedżerze urywki kodu rozwiń Kod desenie-, jeśli dla każdego, spróbuj połowu, właściwości, itp, a następnie Obsługi błędów (wyjątki).Aby uzyskać więcej informacji, zobacz Wstawki kodu.

Na koniec bloku

Jeśli masz jedną lub więcej instrukcji, które należy uruchomić przed zamknięciem Try struktury, użyj Finally bloku.Formant przechodzi do Finally zablokować tuż przed przekazaniem z Try…Catch struktury.To PRAWDA, nawet jeśli wyjątek występuje w dowolnym miejscu wewnątrz Try struktury.

A Finally bloku jest przydatne do uruchamiania dowolnego kodu należy wykonać, nawet jeśli wyjątek.Sterowanie jest przekazywane do Finally bloku, niezależnie od sposobu Try...Catch zablokować wyjść.

Kod w Finally zablokować działa, nawet jeśli napotka kodu Return instrukcji w Try lub Catch bloku.Formant nie przechodzi od Try lub Catch zablokować odpowiadające Finally zablokować w następujących przypadkach:

Nie jest prawidłową jawnie przekazanie wykonywania do Finally bloku.Transferowanie wykonanie z Finally bloku jest nieprawidłowy, z wyjątkiem poprzez wyjątek.

Jeśli Try instrukcja nie zawiera co najmniej jeden Catch bloku, musi zawierać Finally bloku.

PoradaPorada

Jeśli nie masz połowów określone wyjątki, Using instrukcji zachowuje się jak Try…Finally bloku i gwarancje usuwania zasobów, niezależnie od tego, jak zakończyć bloku.Jest to nawet z nieobsługiwany wyjątek.Aby uzyskać więcej informacji, zobacz Using — Instrukcja (Visual Basic).

Argument wyjątek

Catch Blok exception argument jest wystąpieniem Exception klasy lub klasy, który wynika z Exception klasy.Exception Odpowiada wystąpienia klasy błędu, który wystąpił w Try bloku.

Właściwości Exception obiektu pomocy, aby zidentyfikować przyczynę i lokalizacji wyjątku.Na przykład StackTrace właściwość listę o nazwie metody, które doprowadziły do wyjątku, pomaga znaleźć, w którym wystąpił błąd w kodzie.MessageZwraca komunikat, który opisuje wyjątek.HelpLinkZwraca łącze do skojarzonego pliku pomocy.InnerExceptionZwraca Exception zwraca obiekt, który spowodował wyjątek bieżącego lub Nothing Jeśli nr oryginał Exception.

Uwagi dotyczące korzystania z Try...Instrukcja catch

Użyj Try…Catch instrukcji tylko do wystąpienia zdarzenia programu niezwykłe lub niespodziewanymi sygnału.Następujące powody:

  • Przechwytywanie wyjątków w czasie wykonywania tworzy dodatkowe obciążenie i może być wolniejsze niż pre-checking, aby uniknąć wyjątki.

  • Jeśli Catch bloku nie jest obsługiwana prawidłowo, wyjątek nie może być raportowany poprawnie użytkownikom.

  • Obsługa wyjątków sprawia, że program bardziej złożone.

Nie zawsze trzeba Try…Catch instrukcji, aby sprawdzić, czy warunek, że jest prawdopodobne.Poniższy przykład sprawdza, czy istnieje plik przed próbą otwarcia go.Zmniejsza to potrzebę połowu wyjątek OpenText metody.

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

Zapewnić, że kod w Catch bloków poprawnie zgłosić wyjątki od użytkowników, poprzez rejestrowanie wielowątkowość lub odpowiednie komunikaty.W przeciwnym razie wyjątków może pozostają nieznane.

Metody asynchronicznej

Jeśli metoda z Async modyfikator, można użyć Await operatora w metodzie.Oświadczenie o Await operator zawiesza wykonywanie metody dopiero po zakończeniu zadania oczekiwany.Zadanie reprezentuje pracy w toku.Gdy zadanie, które jest skojarzone z Await operator kończy wykonywanie życiorysów w tej samej metody.Aby uzyskać więcej informacji, zobacz Przepływ sterowania w aplikacjach asynchronicznych (C# i Visual Basic).

Zwrócony przez metodę komunikacji asynchronicznej zadania może zakończyć stan, wskazujące, że to zakończone z powodu nieobsłużonego wyjątku.Zadania mogą również zakończyć w stanie anulowane w OperationCanceledException są generowane z wyrażenia await.Do połowu, albo typ wyjątku, umieścić Await wyrażenie skojarzone z zadaniem w Try zablokować i połowu wyjątek w Catch bloku.Przykładem jest świadczone w dalszej części tego tematu.

Zadanie może być stan, ponieważ wiele wyjątków jest odpowiedzialny za jego spowodował błąd.Na przykład zadanie może być wynikiem wywołania Task.WhenAll.Gdy czekają na takie zadania wykrył wyjątek jest tylko jeden z wyjątków i nie można przewidzieć wyjątek, który zostanie przechwycony.Przykładem jest świadczone w dalszej części tego tematu.

Await Wyrażenie nie może być wewnątrz Catch bloku lub Finally bloku.

Iteratory

Funkcja sterująca lub Get akcesor wykonuje niestandardowe iteracji w kolekcji.Używa iterację dają instrukcja zwraca każdy element kolekcji jedną naraz.Wywołania funkcji iteratora za pomocą For Each...Next — Instrukcja (Visual Basic).

A Yield instrukcji może znajdować się wewnątrz Try bloku.A Try bloku, który zawiera Yield instrukcji może mieć Catch blokuje i może mieć Finally bloku.Zobacz sekcję "Spróbuj bloki w języku Visual Basic" Iteratory (C# i Visual Basic) przykład.

A Yield instrukcja nie może znajdować się wewnątrz Catch bloku lub Finally bloku.

Jeśli For Each organ (poza funkcja sterująca) generuje wyjątek, Catch w funkcji iteratora bloku nie jest wykonywana, ale Finally blok w funkcji iteratora jest wykonywany.A Catch blok wewnątrz funkcji iteratora połowy tylko wyjątki, które występują wewnątrz funkcji iteratora.

Sytuacje częściowego zaufania

W sytuacjach częściowego zaufania, na przykład aplikacja obsługiwana w udziale sieciowym Try...Catch...Finally nie może przechwytywać wyjątków zabezpieczeń, które występują przed wywoływana jest metoda, która zawiera wywołanie.Następujący przykład: po umieszczeniu go w udziale serwera i uruchom tam powoduje błąd "System.Security.SecurityException: żądanie nie powiodło się." Aby uzyskać więcej informacji na temat wyjątki zabezpieczeń zobacz SecurityException klasy.

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

W takiej sytuacji częściowego zaufania należy umieścić Process.Start instrukcji w odrębnym Sub.Początkowe wywołanie Sub nie powiedzie się.Umożliwia to Try...Catch do połowu go przed Sub , która zawiera Process.Start jest uruchomiona i wyprodukowanych wyjątek zabezpieczeń.

Przykład

Poniższy przykład ilustruje strukturę Try...Catch...Finally instrukcji.

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

W poniższym przykładzie CreateException metoda generuje NullReferenceException.Kod, który generuje wyjątek nie jest w Try bloku.Dlatego CreateException metoda nie obsługuje wyjątek.RunSample Metody obsługi wyjątku, ponieważ wywołanie CreateException jest metoda Try bloku.

Przykład zawiera Catch instrukcji dla kilku typów wyjątków, uporządkowane od najbardziej specyficzny dla najbardziej ogólnym.

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

Poniższy przykład pokazuje, jak używać Catch When instrukcji, aby odfiltrować wyrażenia warunkowego.Jeśli warunkowe wyrażenie True, kod w Catch uruchamia blokowania.

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

W poniższym przykładzie przedstawiono Try…Catch instrukcji zawartych w Try bloku.Wewnętrzne Catch bloku zgłasza wyjątek, który został jej InnerException właściwość pierwotny wyjątek.Zewnętrzne Catch bloku raporty własnych wyjątków i wewnętrzny wyjątek.

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

Poniższy przykład ilustruje asynchronicznej metody obsługi wyjątków.Aby przechwytywać wyjątku, którego dotyczy zadanie asynchroniczne Await wyrażenie jest w Try połowu bloku wywołującego i wyjątek w Catch bloku.

Odkomentuj Throw New Exception linii w przykładzie w celu wykazania obsługi wyjątków.Wyjątek w Catch zablokować zadania IsFaulted właściwość jest ustawiona na Truei zadania Exception.InnerException ustawiono właściwość wyjątku.

Odkomentuj Throw New OperationCancelledException linii wykazać, co się dzieje, gdy anulować proces asynchroniczny.Wyjątek w Catch bloku i zadania IsCanceled właściwość jest ustawiona na True.Jednak w pewnych warunkach, które nie dotyczą tego przykładu IsFaulted jest ustawiona na True i IsCanceled jest ustawiona 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

Poniższy przykład ilustruje obsługi wyjątków, gdzie wiele wyjątków może powodować wiele zadań.Try Blok ma Await wyrażenie dla zadania, Task.WhenAll zwracane.Zadanie zostało wykonane podczas trzech zadań, do której Task.WhenAll jest stosowane są kompletne.

Każdy z trzech zadań powoduje wyjątek.Catch Bloku iterację wyjątków, które znajdują się w Exception.InnerExceptions właściwości zadania, Task.WhenAll zwracane.

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

Zobacz też

Informacje

Err

Exit — Instrukcja (Visual Basic)

On Error — Instrukcja (Visual Basic)

Exception

Throw — Instrukcja (Visual Basic)

Koncepcje

Najlepsze praktyki dotyczące korzystania z wstawek kodu

Obsługa wyjątku (Biblioteka zadań równoległych)