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

Kod çalıştırmaya devam ederken belirli bir kod bloğunda oluşabilecek olası hataların bazılarını veya tümünü işlemek için bir yol sağlar.

Sözdizimi

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

Parça

Süre Tanım
tryStatements isteğe bağlı. Hatanın oluşabileceği deyimler. Bileşik bir deyim olabilir.
Catch isteğe bağlı. Birden çok Catch bloka izin verilir. Blok işlenirken Try bir özel durum oluşursa, her Catch deyim, özel durumu işleyip işlemediğini belirlemek için metin sırasına göre incelenerek, exception oluşan özel durumu temsil eder.
exception isteğe bağlı. Herhangi bir değişken adı. öğesinin exception ilk değeri, oluşan hatanın değeridir. Yakalanan hatayı belirtmek için ile kullanılır Catch . Belirtilmezse, Catch deyimi herhangi bir özel durum yakalar.
type isteğe bağlı. Sınıf filtresinin türünü belirtir. değeri exception , türetilmiş veya türetilmiş bir tür tarafından type belirtilen türdeyse, tanımlayıcı özel durum nesnesine bağlanır.
When isteğe bağlı. Yan Catch tümcesine sahip bir When deyim yalnızca olarak değerlendirildiğinde expressionTrueözel durumları yakalar. Yan When tümcesi yalnızca özel durumun türü denetlendikten sonra uygulanır ve expression özel durumu temsil eden tanımlayıcıya başvurabilir.
expression isteğe bağlı. örtük olarak dönüştürülebilir Booleanolmalıdır. Genel filtreyi açıklayan herhangi bir ifade. Genellikle hata numarasına göre filtrelemek için kullanılır. Hatanın hangi koşullarda yakalanacağını belirtmek için anahtar sözcükle birlikte When kullanılır.
catchStatements isteğe bağlı. İlişkili Try blokta oluşan hataları işlemek için deyimler. Bileşik bir deyim olabilir.
Exit Try isteğe bağlı. Yapıdan Try...Catch...Finally çıkan anahtar sözcük. Yürütme, deyiminin hemen ardından kodla devam eder End Try . Deyimi Finally yine yürütülür. Bloklarda Finally izin verilmez.
Finally isteğe bağlı. Finally Yürütme deyiminin herhangi bir bölümünden Try...Catch ayrıldığında her zaman bir blok yürütülür.
finallyStatements isteğe bağlı. Diğer tüm hata işleme işlemleri gerçekleştikten sonra yürütülen deyimler.
End Try Yapıyı sonlandırır Try...Catch...Finally .

Açıklamalar

Kodun belirli bir bölümünde belirli bir özel durumun oluşabileceğini düşünüyorsanız, kodu bir Try bloğun içine koyun ve bir blok kullanarak Catch denetimi koruyun ve oluşursa özel durumu işleyin.

DeyimiTry…Catch, çeşitli özel durumlar için işleyicileri belirten bir veya daha fazla Catch yan tümcesi tarafından izlenen bir Try blok oluşur. Bir Try blokta özel durum oluşturulduğunda, Visual Basic özel durumu işleyen deyimini arar Catch . Eşleşen Catch bir deyim bulunamazsa, Visual Basic geçerli yöntemi çağıran yöntemi inceler ve bu şekilde çağrı yığınını yukarı alır. Catch Hiçbir blok bulunmazsa, Visual Basic kullanıcıya işlenmeyen bir özel durum iletisi görüntüler ve programın yürütülmesini durdurur.

Bir deyimde Try…Catch birden Catch fazla deyim kullanabilirsiniz. Bunu yaparsanız, yan tümcelerin Catch sırası önemlidir çünkü sırayla incelenirler. Catch daha az özel olanlardan önce daha belirgin özel durumlar.

Aşağıdaki Catch deyim koşulları en az özeldir ve sınıfından Exception türetilen tüm özel durumları yakalar. Beklediğiniz tüm özel durumları yakaladıktan sonra normalde bu çeşitlemelerden birini yapıdaki Try...Catch...Finally son Catch blok olarak kullanmanız gerekir. Denetim akışı hiçbir zaman bu çeşitlemelerden birini izleyen bir Catch bloğa ulaşamıyor.

  • type şöyledirException: örneğin:Catch ex As Exception

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

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

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

İpucu

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

Finally bloğu

Yapıdan çıkmadan Try önce çalışması gereken bir veya daha fazla deyiminiz varsa, bir Finally blok kullanın. Denetim, yapıdan çıkmadan hemen önce bloğuna Try…Catch geçerFinally. Bu, yapının içinde Try herhangi bir yerde bir özel durum oluşsa bile geçerlidir.

Finally Blok, bir özel durum olsa bile yürütülmesi gereken herhangi bir kodu çalıştırmak için kullanışlıdır. Denetim, bloğun Finally nasıl çıktığına bakılmaksızın bloğa Try...Catch geçirilir.

Bir bloktaki Finally kod, kodunuz veya Catch bloğunda Try bir Return deyimle karşılaşsa bile çalışır. Denetim, aşağıdaki durumlarda bir Try veya Catch bloğundan ilgili Finally bloğa geçmez:

Yürütmeyi açıkça bir Finally bloğa aktarmak geçerli değildir. Bir Finally bloktan yürütme aktarımı, bir özel durum dışında geçerli değildir.

Bir deyim en az bir TryCatch blok içermiyorsa, bir Finally blok içermelidir.

İpucu

Belirli özel durumları yakalamak zorunda değilseniz, Using deyimi bir Try…Finally blok gibi davranır ve blok nasıl çıktığınıza bakılmaksızın kaynakların atılması garanti eder. Bu, işlenmeyen bir özel durumla bile geçerlidir. Daha fazla bilgi için bkz . Using Deyimi.

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

Catch Blok exception bağımsız değişkeni, sınıfının bir örneği Exception veya sınıfından Exception türetilen bir sınıftır. Exception Sınıf örneği, blokta oluşan hataya Try karşılık gelir.

nesnesinin Exception özellikleri, bir özel durumun nedenini ve konumunu belirlemeye yardımcı olur. Örneğin, özelliği özel StackTrace duruma yol açan çağrılan yöntemleri listeler ve hatanın kodda nerede oluştuğunı bulmanıza yardımcı olur. 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. InnerExceptionException geçerli özel duruma neden olan nesneyi döndürür veya özgün Exceptionbir öğesi yoksa döndürürNothing.

Deyimi Try…Catch kullanırken dikkat edilmesi gerekenler

Try…Catch Deyimi yalnızca olağan dışı veya beklenmeyen program olaylarının oluştuğuna işaret etmek için kullanın. Bunun nedenleri şunlardır:

  • Catchçalışma zamanında özel durumlar ing ek yük oluşturur ve özel durumları önlemek için ön denetimden daha yavaş olabilir.

  • Bir Catch blok doğru işlenmediyse, özel durum kullanıcılara doğru şekilde bildirilmeyebilir.

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

Olası bir Try…Catch koşulu denetlemek için her zaman bir deyime ihtiyacınız yoktur. Aşağıdaki örnek, dosyayı açmaya çalışmadan önce var olup olmadığını denetler. Bu, yöntemi tarafından oluşan bir özel durumu yakalama gereksinimini 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

bloklardaki Catch kodun, iş parçacığı güvenli günlük kaydı veya uygun iletiler aracılığıyla özel durumları kullanıcılara düzgün bir şekilde bildirediğinden emin olun. Aksi takdirde, özel durumlar bilinmiyor olarak kalabilir.

Zaman uyumsuz yöntemler

Bir yöntemi Zaman Uyumsuz değiştirici ile işaretlerseniz yönteminde Await işlecini kullanabilirsiniz. işlecine Await sahip bir deyim, beklenen görev tamamlanana kadar yönteminin yürütülmesini askıya alır. Görev, devam eden çalışmayı temsil eder. İşleçle Await ilişkili görev tamamlandığında, yürütme aynı yöntemde devam eder. Daha fazla bilgi için bkz . Zaman Uyumsuz Programlarda Denetim Akışı.

Async yöntemi tarafından döndürülen bir görev, işlenmeyen bir özel durum nedeniyle tamamlandığını gösteren hatalı bir durumda sona erebilir. Bir görev iptal edilmiş durumda da sona erebilir ve bu da await ifadesinin dışına atılmasıyla sonuçlanabilir OperationCanceledException . Her iki özel durum türünü de yakalamak için, görevle ilişkili ifadeyi Await bir Try bloğun içinde yerleştirin ve bloktaki özel durumu yakalayın Catch . Bu konunun ilerleyen bölümlerinde bir örnek verilmiştir.

Birden çok özel durum hatalı olduğundan bir görev hatalı durumda olabilir. Örneğin, görev çağrısının Task.WhenAllsonucu olabilir. Böyle bir görevi beklediğiniz zaman, yakalanan özel durum yalnızca özel durumlardan biridir ve hangi özel durumun yakalanacağını tahmin edebilirsiniz. Bu konunun ilerleyen bölümlerinde bir örnek verilmiştir.

İfade Await bir Catch bloğun veya Finally bloğun içinde olamaz.

Yineleyiciler

Yineleyici işlevi veya Get erişimcisi bir koleksiyon üzerinde özel yineleme gerçekleştirir. Yineleyici, koleksiyonun her öğesini birer birer döndürmek için bir Yield deyimi kullanır. Her İçin... kullanarak yineleyici işlevini çağırırsınız. Next Deyimi.

Deyimi Yield bir Try bloğun içinde olabilir. Deyimi Try içeren bir Yield bloğun blokları olabilir Catch ve bir Finally bloğu olabilir. Bir örnek için bkz Try . Bloklar.

Deyimi Yield bir Catch blok veya Finally blok içinde olamaz.

For Each Gövde (yineleyici işlevinin dışında) bir özel durum oluşturursa, yineleyici işlevindeki bir Catch blok yürütülür, ancak yineleyici işlevindeki bir Finally blok yürütülür. Catch Yineleyici işlevinin içindeki bir blok yalnızca yineleyici 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, Try...Catch...Finally çağrıyı içeren yöntem çağrılmadan önce oluşan güvenlik özel durumlarını yakalamaz. Aşağıdaki örnek, bunu bir sunucu paylaşımına yerleştirip oradan çalıştırdığınızda "System.Security.SecurityException: İstek Başarısız Oldu" hatasını oluşturur. 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
    Console.WriteLine("Can't load Web page" & vbCrLf & ex.Message)
End Try

Böyle bir kısmi güven durumunda deyimini Process.Start ayrı Subbir içine koymanız gerekir. öğesine yapılan ilk çağrı Sub başarısız olur. Bu, içeren Process.Start başlatılmadan ve güvenlik özel durumu üretilmeden önce Sub yakalamayı sağlarTry...Catch.

Örnekler

Yapısı Try...Catch...Finally

Aşağıdaki örnekte deyiminin yapısı gösterilmektedir Try...Catch...Finally .

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.
        Console.WriteLine("end of Try block")
    Catch ex As Exception
        ' Show the exception's message.
        Console.WriteLine(ex.Message)

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

Bloktan çağrılan bir yöntemde özel Try durum

Aşağıdaki örnekte yöntemi CreateException bir NullReferenceExceptionoluşturur. Özel durumu oluşturan kod bir Try blokta değil. Bu nedenle, CreateException yöntemi özel durumu işlemez. yöntemine RunSample yapılan çağrı CreateException bir Try blokta olduğundan yöntemi özel durumu işler.

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

Public Sub RunSample()
    Try
        CreateException()
    Catch ex As System.IO.IOException
        ' Code that reacts to IOException.
    Catch ex As NullReferenceException
        Console.WriteLine("NullReferenceException: " & ex.Message)
        Console.WriteLine("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 örnekte, koşullu ifadeyi Catch When filtrelemek için deyimin nasıl kullanılacağı gösterilmektedir. Koşullu ifade olarak değerlendirilirse True, bloktaki Catch kod ç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 deyimler

Aşağıdaki örnekte bir Try…Catch bloğun içinde yer alan bir Try deyimi vardır. İç Catch blok, özelliği özgün özel duruma InnerException ayarlanmış bir özel durum oluşturur. Dış Catch blok kendi özel durumunu ve iç özel durumunu bildirir.

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 örnekte zaman uyumsuz yöntemler için özel durum işleme gösterilmektedir. Zaman uyumsuz göreve uygulanan bir özel durumu yakalamak için, Await ifade çağıranın bir Try bloğundadır ve özel durum bloğunda Catch yakalanılır.

Özel durum işlemeyi Throw New Exception göstermek için örnekteki satırın açıklamasını kaldırın. Özel durum bloğuna Catch yakalanmış, görevin IsFaulted özelliği olarak ayarlanmış Trueve görevin Exception.InnerException özelliği özel duruma ayarlanmıştır.

Throw New OperationCancelledException Zaman uyumsuz bir işlemi iptal ettiğinizde ne olacağını göstermek için satırın açıklamasını kaldırın. Özel durum bloğuna Catch yakalanmış ve görevin IsCanceled özelliği olarak Trueayarlanmıştır. Ancak, bu örnekte IsFaulted geçerli olmayan bazı koşullar altında olarak ayarlanır True ve IsCanceled olarak ayarlanır 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

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

Aşağıdaki örnekte, birden çok görev birden çok özel duruma neden olabilecek özel durum işleme gösterilmektedir. Bloğunda TryAwait , döndürülen görevin Task.WhenAll ifadesi bulunur. Uygulanan üç görev tamamlandığında görev Task.WhenAll tamamlanır.

Üç görevden her biri bir özel duruma neden olur. Catch Blok, döndürülen görevin Task.WhenAll özelliğinde Exception.InnerExceptions bulunan özel durumlar aracılığıyla yinelenir.

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.