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

Kod çalıştırmaya devam ederken belirli bir kod bloğunda meydana gelen olası hataların bir veya hepsini işlemek için bir yol sağlar.

Syntax

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

Bölümler

Süre Tanım
tryStatements İsteğe bağlı. Hatanın oluştuğu deyimler. Bileşik deyim olabilir.
Catch İsteğe bağlı. İzin Catch verilen birden çok blok. Blok işlendiğinde bir özel durum oluşursa, her deyimin özel durumu işip işlemeyecek ve oluşan özel durumu temsil edecek şekilde metinsel Try Catch olarak exception incelenecektir.
exception İsteğe bağlı. Herhangi bir değişken adı. İlk exception değeri, hatanın değeridir. Yakalanan hatayı Catch belirtmek için ile kullanılır. Atlanırsa, deyimi Catch herhangi bir özel durumu yakalar.
type İsteğe bağlı. Sınıf filtresinin türünü belirtir. değeri tarafından veya exception türetilmiş bir tür tarafından belirtilen türde type ise, tanımlayıcı özel durum nesnesine bağlı hale gelir.
When İsteğe bağlı. Yan Catch tümcesine When sahip bir deyim yalnızca olarak değerlendirilen özel durumları expression True yakalar. Yan tümcesi yalnızca özel durumun türü denetlendikten sonra uygulanır When ve özel durumu temsil eden expression tanımlayıcıya başvuruda olabilir.
expression İsteğe bağlı. için örtülü olarak dönüştürülebilir olması Boolean gerekir. Genel bir filtreyi açıklayan herhangi bir ifade. Genellikle hata numarasına göre filtrelemek için kullanılır. Hatanın When yakalanarak hangi koşulların altında olduğunu belirtmek için anahtar sözcüğüyle birlikte kullanılır.
catchStatements İsteğe bağlı. İlişkili blokta oluşan hataları işlemek için Try deyimleri. Bileşik deyim olabilir.
Exit Try İsteğe bağlı. Yapıyı bozan anahtar Try...Catch...Finally sözcük. Yürütme, deyiminden hemen sonra kodla devam End Try eder. Finallydeyimi yine yürütülür. Bloklarda izin Finally verilmez.
Finally İsteğe bağlı. Yürütme Finally deyiminin herhangi bir parçasından ayrıldığında her zaman bir blok Try...Catch yürütülür.
finallyStatements İsteğe bağlı. Diğer tüm hata işleme gerçekleştikten sonra yürütülen deyimler.
End Try Yapıyı Try...Catch...Finally sonlandırılır.

Açıklamalar

Belirli bir özel durumun kodun belirli bir bölümü sırasında meydana olabileceğini bekliyorsanız, kodu bir bloğuna koyarak denetimi korumak ve özel durum oluşursa bu özel durumu işlemek Try Catch için bir blok kullanın.

Deyimi, çeşitli özel durumlar için işleyicileri belirten bir veya daha fazla yan Try…Catch Try Catch tümcesi tarafından takip edilen bir bloktan oluşur. Bir blokta bir özel durum Try Visual Basic özel durumu ele alan Catch deyimini ayalar. Eşleşen bir deyim bulunamasa Visual Basic yöntemini inceler ve çağrı Catch yığınını yukarıya kadar gösterir. Herhangi bir Catch blok buluna Visual Basic kullanıcıya işlanmamış bir özel durum iletisi görüntüler ve programın yürütülmesini durdurur.

Bir deyiminde birden fazla Catch deyim Try…Catch kullanabilirsiniz. Bunu yaparsanız yan tümcelerinin Catch sırası önemlidir çünkü bunlar sırayla incelendi. Daha az belirli özel durumlardan önce daha belirli özel durumları yakalar.

Aşağıdaki Catch deyim koşulları en az belirlidir ve sınıfından türeten tüm özel durumları Exception yakalar. Beklediğiniz tüm özel durumları yakaladikten sonra normalde bu çeşitlemelerden birini yapının son Catch Try...Catch...Finally bloğu olarak kullan gerekir. Denetim akışı, bu türlerden Catch herhangi birini izleyen bir block'a asla ulaşamaz.

  • type, Exception örneğin:Catch ex As Exception

  • deyiminin değişkeni exception yoktur, örneğin: Catch

Bir deyim Try…Catch…Finally başka bir blokta iç içe Try Visual Basic önce en içteki Catch bloktaki her deyimi Try inceler. Eşleşen bir Catch deyim bulunamasa, arama dış Catch bloğun deyimlerine Try…Catch…Finally devam eder.

Bloktan yerel Try değişkenler ayrı bloklar olduğundan bir Catch blokta kullanılamaz. Birden fazla blokta bir değişken kullanmak için değişkeni yapının dışında Try...Catch...Finally bildirin.

İpucu

deyimi Try…Catch…Finally bir IntelliSense kod parçacığı olarak kullanılabilir. Kod Parçacıkları Yöneticisi'nde Kod Desenleri - If, For Each, Try Catch, Property, vb. ve ardından Hata İşleme (Özel Durumlar) 'ı genişletin. Daha fazla bilgi için bkz. Kod Parçacıkları.

Son olarak engelle

Yapıdan çıkmadan önce çalışması gereken bir veya daha fazla deyiminiz Try varsa bir blok Finally kullanın. Denetim, Finally yapıdan hemen önce bloğuna Try…Catch geçer. Yapının herhangi bir yerinde özel durum olsa bile bu Try durum geçerli olur.

Blok, Finally bir özel durum olsa bile yürütülecek tüm kodlar için kullanışlıdır. Denetim, bloğun Finally çıkışından bağımsız olarak Try...Catch bloğuna geçirildi.

Kodunuz veya Finally bloğundaki bir deyimle karşılaşsa bile Return blokta kod Try Catch çalışır. Denetim, aşağıdaki durumlarda Try bir veya Catch bloğundan karşılık gelen Finally bloğuna geçmez:

Yürütmeyi bir bloka açıkça aktarmak geçerli Finally değildir. Yürütmenin bir bloktan Finally aktarılması, özel durum dışında geçerli değildir.

Bir Try deyim en az bir blok Catch içeriyorsa, bir blok Finally içermesi gerekir.

İpucu

Belirli özel durumları yakalamanız gerek yoksa, deyimi bir blok gibi davranır ve bloktan nasıl çıksanız da kaynakların Using Try…Finally atılması garantisini sağlar. İşlenemeyen bir özel durumla bile bu doğrudur. Daha fazla bilgi için bkz. Using Deyimi.

Özel durum bağımsız değişkeni

Blok Catch bağımsız değişkeni sınıfın bir örneği veya exception Exception sınıfından türeten bir Exception sınıftır. ExceptionSınıf örneği, blokta meydana gelen hataya karşılık Try geldi.

nesnesinin Exception özellikleri, bir özel durumun nedenini ve konumunu belirlemeye yardımcı olur. Örneğin özelliği, kodda hatanın nerede meydana geldiğine yardımcı olarak özel durumuna yol StackTrace alan çağrılı metotları listeler. Message , özel durumu açıklayan bir ileti döndürür. HelpLink ilişkili bir Yardım dosyasının bağlantısını döndürür. InnerException geçerli Exception özel durumuna neden olan nesneyi döndürür veya özgün Nothing yoksa Exception döndürür.

Deneyin... Catch deyimi

Bir deyimi Try…Catch yalnızca olağan dışı veya beklenmedik program olaylarının ortaya çıkmasını işaret etmek için kullanın. Bunun nedenleri şunlardır:

  • Çalışma zamanında özel durumları yakalamak ek yük oluşturur ve özel durumlardan kaçınmak için ön denetimden daha yavaş olabilir.

  • Bir Catch blok doğru şekilde işlenmişse, özel durum kullanıcılara doğru bildirilenemebilir.

  • Özel durum işleme bir programı daha karmaşık hale gelir.

Olası bir koşulu kontrol Try…Catch etmek için her zaman deyimine ihtiyacınız olmaz. Aşağıdaki örnek, dosyayı açmaya çalışmadan önce bir dosyanın mevcut olup olmadığını denetler. Bu yöntem tarafından bir özel durum yakalama ihtiyacı OpenText azaltır.

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

Bloklar içinde Catch kodun, iş parçacığı güvenli günlük kaydı veya uygun iletiler aracılığıyla kullanıcılara düzgün bir şekilde özel durum bildireyene kadar emin olun. Aksi takdirde, özel durumlar bilinmiyor olabilir.

Zaman uyumsuz yöntemler

Bir yöntemi Async değiştiricisi ile işaretleyeceksiniz, yönteminde Await işleci kullanabilirsiniz. işlecine sahip Await bir deyim, beklenen görev tamamlayana kadar yönteminin yürütülmesini askıya alır. Görev, devam eden işi temsil eder. İşleciyle ilişkili görev Await sona geldiğinde yürütme aynı yöntemde devam eder. Daha fazla bilgi için bkz. Async Programlarında Flow Denetim Özellikleri.

Zaman uyumsuz yöntem tarafından döndürülen bir görev, işlenmemiş bir özel durum nedeniyle tamamlandıktan sonra hatalı bir durumda sona erer. Bir görev iptal edildi durumuyla da sona erer ve bu da OperationCanceledException await ifadesinin dışında bir sonuç verir. Herhangi bir özel durum türünü yakalamak için, görevle ilişkili ifadeyi bir Await Try bloğuna yer ve özel durumu Catch blokta yakalar. Bu konu başlığında daha sonra bir örnek verilmektedir.

Bir görev hatalı durumda olabilir çünkü hatalı durumdan birden çok özel durum sorumlu olabilir. Örneğin, görev çağrısının sonucu Task.WhenAll olabilir. Böyle bir görevi beklerken yakalanan özel durum yalnızca bir özel durumdur ve hangi özel durumun yakalanacaklarını tahmin etmek mümkün değildir. Bu konu başlığında daha sonra bir örnek verilmektedir.

İfade Await bir bloğun veya Catch bloğun içinde yer Finally alamdır.

Yineleyiciler

Bir tekrarlayıcı işlevi veya Get erişimci, bir koleksiyon üzerinde özel yineleme gerçekleştirir. Bir tekrarlayıcı, koleksiyonun her öğesini tek tek dönmek için bir Yield deyimi kullanır. Her biri için... kullanarak birerator işlevi çağrılır. Next Deyimi.

Deyimi Yield bir bloğun içinde Try olabilir. Deyimi Try içeren bir Yield bloğun blokları olabilir ve bir bloğu Catch Finally olabilir. Örneğin, Tekrarlayıcılar'ın "Visual Basic Bloklar'da Deneme" bölümüne bakın.

Deyim Yield bir bloğun veya Catch bloğun içinde Finally olamaz.

Gövde (yineleyici işlevinin dışında) bir özel durum oluşturursa yineleyici işlevinde bir blok yürütülmez, ancak yineleyici işlevinde bir For Each Catch blok Finally yürütülür. Bir Catch iterator işlevinin içindeki bir blok, yalnızca bir kez dahaerator işlevinin içinde oluşan özel durumları yakalar.

Kısmi güven durumları

Ağ paylaşımında barındırılan bir uygulama gibi kısmi güven durumlarında, çağrıyı içeren yöntem çağrılmadan önce oluşan güvenlik özel Try...Catch...Finally durumlarını yakalamaz. Aşağıdaki örnek, sunucu paylaşımına koyarak buradan çalıştırarak "System.Security.SecurityException: Request Failed" hatasını verir. Güvenlik özel durumları hakkında daha fazla bilgi için sınıfına SecurityException bakın.

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

Böyle bir kısmi güven örneğinde deyimini ayrı bir Process.Start içine Sub koyarak. için ilk çağrı Sub başarısız olur. Bu, Try...Catch içeren başlamadan ve güvenlik özel durumu Sub Process.Start üretilmeden önce yakalamayı sağlar.

Örnekler

The structure of Try... Yakalamak... Sonunda

Aşağıdaki örnek deyiminin yapısını Try...Catch...Finally göstermektedir.

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

Try bloğundan çağrılmış bir yöntemde özel durum

Aşağıdaki örnekte yöntemi CreateException bir NullReferenceException atar. Özel durumu oluşturan kod bir blok içinde Try değildir. Bu nedenle CreateException yöntemi özel durumu işlemez. yöntemine RunSample yapılan çağrı bir blokta olduğundan yöntemi özel CreateException durumu Try işlemez.

Örnek, en özel durumdan en genele doğru sıra Catch edilen çeşitli özel durum türlerine yönelik deyimleri içerir.

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

Catch When deyimi

Aşağıdaki örnek, koşullu bir ifadeyi Catch When filtrelemek için deyiminin nasıl kullanılageldi? Koşullu ifade olarak True değerlendirilirse, blokta kod Catch çalışır.

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

İç içe Try deyimleri

Aşağıdaki örnekte bir Try…Catch bloğu içinde yer alan bir deyimi yer Try alan. İç Catch blok, özelliği özgün özel durum olarak InnerException ayarlanmış bir özel durum oluşturur. Dış blok Catch kendi özel durumlarını ve iç özel durumu raporlar.

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

Zaman uyumsuz yöntemler için özel durum işleme

Aşağıdaki örnek, zaman uyumsuz yöntemler için özel durum işlemeyi göstermektedir. Zaman uyumsuz bir göreve uygulanan bir özel durumu yakalamak için, ifade çağıranın bloğundadır ve özel Await Try durum blokta Catch yakalır.

Özel durum Throw New Exception işlemeyi göstermek için örnekteki satırın yorumlarını geri anın. Özel durum bloğunda yakalır, görevin özelliği olarak ayarlanır ve görevin Catch özelliği özel durum olarak IsFaulted True Exception.InnerException ayarlanır.

Zaman uyumsuz bir Throw New OperationCancelledException işlemi iptal edin ve ne olacağını göstermek için satırın açıklarını seçin. Özel durum bloğunda Catch yakalır ve görevin IsCanceled özelliği olarak True ayarlanır. Ancak, bu örnekte geçerli olan bazı koşullar altında IsFaulted olarak ayarlanır ve olarak True IsCanceled False ayarlanır.

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

Zaman uyumsuz yöntemlerde birden çok özel durumu işleme

Aşağıdaki örnek, birden çok görevi birden çok özel durumla sonuçlandırarak özel durum işlemeyi gösterir. Blok, Try döndürülen görev için Await ifadeye Task.WhenAll sahip. Uygulanan üç görev tamamlandığında görev Task.WhenAll tamamlanır.

Üç görevden her biri bir özel durum oluşturur. CatchBlok, döndürülen görevin özelliğinde bulunan özel Exception.InnerExceptions durumlar aracılığıyla Task.WhenAll tekrarlar.

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

Ayrıca bkz.