Try...Catch...Finally Deyimi (Visual Basic)
Belirli bir kod bloğu içinde hala kodu çalıştırırken oluşabilecek bazı veya tüm olası hataları işlemek için bir yol sağlar.
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try
Bölümleri
Terim |
Tanım |
tryStatements |
İsteğe Bağlı.Deyim burada bir hata oluşabilir.Bileşik deyim olabilir. |
Catch |
İsteğe Bağlı.Birden çok Catch izin engeller.İşlerken bir özel durum oluþursa Try engellemek, her Catch , özel durum ile işleme olup olmadığını belirlemek için metinsel sırada deyimi incelendi exception temsil eden özel durum oluşturuldu. |
exception |
İsteğe Bağlı.Herhangi bir değişken adı.Başlangıç değeri exception thrown hata değeridir.Kullanılan Catch hata belirlemek için yakalandı.Atlanırsa, Catch deyimi herhangi bir özel durum yakalar. |
type |
İsteğe Bağlı.Sınıf filtre türünü belirtir.Varsa değeri exception tarafından belirtilen türde type veya türetilmiş bir tür tanımlayıcı özel nesneye bağımlı hale gelir. |
When |
İsteğe Bağlı.A Catch ifadesi ile bir When yan tümcesi özel durumları yakalar sadece expression veren True.A When yan tümcesi yalnızca özel durumun türünü denetlendikten sonra uygulanır ve expression özel durum gösteren tanımlayıcıyı başvuruyor olabilir. |
expression |
İsteğe Bağlı.Örtük olarak dönüştürülebilir olmalıdır Boolean.Bir genel süzgeç açıklayan herhangi bir deyimdir.Genellikle hata numarasına göre filtre uygulamak için kullanılır.Kullanılan When koşullar altında hata yakalandı belirtmek için anahtar sözcük. |
catchStatements |
İsteğe Bağlı.İlişkili ortaya çıkan hataları işlemek için deyim Try blok.Bileşik deyim olabilir. |
Exit Try |
İsteğe Bağlı.İşyeri sonları anahtar sözcük Try...Catch...Finally yapısı.Yürütme devam eder, hemen ardından kodu ile End Try ifadesi.Finally İfadesi hala yürütülür.İçinde izin verilmeyen Finally engeller. |
Finally |
İsteğe Bağlı.A Finally blok her zaman yürütülen herhangi bir parçasını yürütme ayrıldığında, Try...Catch ifadesi. |
finallyStatements |
İsteğe Bağlı.Diğer tüm hata işleme gerçekleştikten sonra yürütülen deyim. |
End Try |
Sona Try...Catch...Finally yapısı. |
Notlar
Belirli bir özel durum kodu belirli bir bölümü sırasında ortaya çıkabilecek bekliyorsanız, kod koymak bir Try engellemek ve kullanan bir Catch denetim korumak ve bu durum oluşursa, özel durumunu işlemesi için blok.
A Try…Catch deyimi oluşur bir Try blok ve ardından bir veya daha fazla Catch yan tümceleri çeşitli özel durum işleyicilerini belirtin.Ne zaman bir exception Is thrown bir Try blok, Visual Basic arar Catch özel durum işleme ifadesi.Eşleşen bir ise Catch ekstresi bulunamadı, Visual Basic vb. çağrı yığını yukarı geçerli yöntemi adı verilen yöntemi inceler.Yok, Catch blok bulunduğunda, Visual Basic kullanıcı tarafından işlenmeyen özel durum iletisi görüntülenir ve program çalışmasını durdurur.
Birden fazla kullanabilirsiniz Catch deyimi içinde bir Try…Catch ifadesi.Bu sırasını Catch yan tümceleri sırayla incelenir nedeniyle önemli.Daha özel durum önce daha az belirgin olanları yakalayın.
Aşağıdaki Catch deyimi koşul az özgüdür ve tüm öğesinden türetilmeli özel durumlar Exception sınıfı.Normalde bu farklılıkların biri son kullanmanız gereken Catch engellemek Try...Catch...Finally sonra beklediğiniz belirli özel durumlarý yakalamak, yapısı.Akış denetimi asla ulaşmak bir Catch ya da bu değişimleri takip eden blok.
The type is Exception, for example:Catch ex As Exception
Hayır ifadesi olan exception değişken, örneğin:Catch
Zaman bir Try…Catch…Finally deyimi içinde başka bir yuvalanmış Try blok, Visual Basic önce her inceler Catch tıklatılır deyiminde Try blok.Eşleşme yok, Catch ifadesi bulunan, aramaya devam eder Catch özetleri dış Try…Catch…Finally blok.
Yerel değişkenleri, bir Try blok kullanılabilir durumda olmayan bir Catch ayrı taşları, çünkü bunlar engelleyin.Birden fazla blok içinde bir değişken kullanmak istiyorsanız, dış değişken bildirip Try...Catch...Finally yapısı.
İpucu |
---|
Try…Catch…Finally Deyimi IntelliSense kod parçacığı kullanılabilir.Kod parçacıkları Yöneticisi'nde genişletmek kodu desenleri-, her biri için Try Catch, özellik, vb.ve Hata işleme (özel durumlar).Daha fazla bilgi için bkz. Kod Parçacıkları. |
Finally bloğu
Size çıkmadan önce çalıştırılmalıdır bir veya daha fazla ifadeler varsa, Try yapı, kullanan bir Finally blok.Denetim için geçen Finally yalnızca işyeri geçirmeden önce engelleme Try…Catch yapısı.İçinde herhangi bir yerde bir özel durum oluþsa bile bu durum geçerlidir Try yapısı.
A Finally blok, özel bir durum olsa bile, herhangi bir kod çalıştıran yürütmelisiniz için yararlıdır.Denetim geçirilen Finally blok ne olursa olsun nasıl Try...Catch engellemek çıkar.
Kod, bir Finally kodunuzu karşılaşsa da çalıştırır engelleyecek bir Return deyiminde bir Try veya Catch blok.Denetim dan geçirmiyor bir Try veya Catch engellemek için ilgili Finally aşağıdaki durumlarda engelleyin:
Bir End Deyimi 'de karşılaşılan Try veya Catch blok.
A StackOverflowException is thrown in the Try or Catch block.
Açıkça yürütme içine aktarmak için geçerli değil bir Finally blok.Yürütülmesini dışarı aktarma bir Finally blok bir özel durum geçerli değil, dışında.
Bir Try deyimi içermeyen en az bir Catch blok, içermesi gereken bir Finally blok.
İpucu |
---|
Özel durum catch yoksa Using deyimi gibi davranan bir Try…Finally blok ve kaynakların nasıl blok çıkmak ne olursa olsun, garanti elden.Bu, hatta işlenmeyen bir özel durum ile geçerlidir.Daha fazla bilgi için bkz. Using Deyimi (Visual Basic). |
Özel durum bağımsız değişkeni
Catch Blok exception bir örneği olmayan bağımsız değişken Exception sınıfını veya türetildiği sınıfı Exception sınıfı.Exception Sınıf örneğine karşılık gelen oluştu hata Try blok.
Özelliklerini Exception nesne neden olabilir ve bir istisna konumunu tanımlamak için Yardım.Örneğin, StackTrace özelliği, kod, hatanın oluştuğu bulmanıza yardımcı olacak özel durum etmeleri adlı yöntemlerini listeler.Messageözel durumu açıklayan bir ileti verir.HelpLinkilişkilendirilmiş bir Yardım dosyası için bir bağlantı verir.InnerExceptiondöner Exception geçerli durum ya da onu neden nesnesi döndüren Nothing hiçbir özgün ise Exception.
Bir Try kullanırken dikkat edilmesi gereken noktalar...Catch deyimi
Kullanımı bir Try…Catch yalnızca olağandışı veya beklenmeyen program olayların sinyal ifadesi.Bunun nedenleri şunlardır:
Çalışma zamanında özel durumlarý yakalamak ek yük oluşturur ve özel durumları önlemek için pre-checking daha yavaş olması olasıdır.
Yoksa bir Catch blok Is not handled doğru özel durumun doğru kullanıcılara bildirilmemesi değil.
Özel durum işlemenin bir programı daha karmaşık hale getirir.
Her zaman ihtiyacınız olmayan bir Try…Catch ifadesi oluşma olasılığı olan bir koşulu denetlemez.Aşağıdaki örnek, bir dosyayı açmaya çalışmadan önce var olup olmadığını denetler.Bu tarafından atılan bir istisnalarını gereğini azaltır OpenText yöntemi.
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
Bu kodda sağlamak Catch blokları düzgün bildirebilirler kullanıcılara özel durumlar iş parçacıklarını günlüğe kaydetme veya uygun iletileri yoluyla.Aksi takdirde, özel durumlar bilinmeyen kalabilir.
Zaman uyumsuz yöntemleri
Yöntemi ile işaretler, zaman uyumsuz değiştiricisi, kullanabileceğiniz Await yönteminde işleci.İfadesi ile Await işleç awaited görev tamamlanıncaya kadar yönteminin çalışmasını askıya.Görev faaliyette temsil eder.Zaman ile ilişkili görev Await operator biter, ayný yöntem yürütme devam ettirir.Daha fazla bilgi için bkz. Zaman Uyumsuz Programlarda Denetim Akışı (C# ve Visual Basic).
Zaman uyumsuz yöntemi tarafından döndürülen bir görev işlenmeyen bir özel durum nedeniyle tamamlandığını belirten hatalı bir durumda kalırsınız.Bir görevi de yayılma ile sonuçlanan bir iptal edilmiş durumda sonuna bir OperationCanceledException await ifade dışında atılan.Her iki türdeki özel durumu yakalayacak için koyun Await görev ile ilgili ifade bir Try engellemek ve exception catch Catch blok.Bu konuda bir örnek sağlanmaktadır.
Birden çok özel durumlar, hatalı için sorumlu bir görev hatalı bir durumda olabilir.Örneğin, görev çağrısı kaynaklanıyor olabilir Task.WhenAll.Bu tür bir görevi beklemek zaman özel durum yakaladı yalnızca özel durumlar biridir ve özel durum yakalandı tahmin edemezsiniz.Bu konuda bir örnek sağlanmaktadır.
Bir Await içinde deyim olamaz bir Catch blok veya Finally blok.
Yineleyicilerde
Bir yineleyici işlevi veya Get erişimci bir koleksiyon özel bir yineleme yapar.Bir yineleyici kullanan bir Ödeme her öğe koleksiyonunun bir anda dönmek deyimi.Bir yineleyici işlevi kullanarak çağırmak bir For Each...Next Deyimi (Visual Basic).
A Yield deyimi içinde olabilir bir Try blok.A Try içeren blok bir Yield deyimi olabilir Catch engeller ve olabilir bir Finally blok."Deneyin bloklar Visual Basic" bölümüne bakın Yineleyiciler (C# ve Visual Basic) ilgili bir örnek.
A Yield deyimi içinde olamaz bir Catch blok veya bir Finally blok.
For Each Gövde (Yineleyici işlev dışında) bir istisna, bir Catch Yineleyici fonksiyon bloğunda yürütülmez, ancak bir Finally bloğunda Yineleyici işlevi çalıştırılır.A Catch blok içinde bir yineleyici işlevi yalnızca Yineleyici işlevinin içinde oluşan özel durumları yakalar.
Kısmi güven durumlar
Bir ağ paylaşımında bulunan bir uygulama gibi kısmi güven durumlarda Try...Catch...Finally çağrısı içeren yöntemi çağrılmadan önce ortaya çıkan güvenlik özel durumları yakalamaz.Aşağıdaki örnek, bir sunucu paylaşımı ve çalışma buradan geçirdiğinizde, hata üretir "System.Security.SecurityException: İstek başarısız oldu." Güvenlik özel durumları hakkında daha fazla bilgi için bkz: SecurityException sınıfı.
Try
Process.Start("https://www.microsoft.com")
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try
Bu tür bir kısmi güven durumda yerine koymak zorunda Process.Start ayrı bir deyim Sub.İlk arama Sub başarısız olur.Böylece Try...Catch daha önce yakalamak için Sub içeren Process.Start başlatıldığını ve güvenlik özel durumu üretilen.
Örnek
Yapısı aşağıdaki örnekte gösterilmiştir Try...Catch...Finally ifadesi.
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
Aşağıdaki örnekte, CreateException yöntemi atar bir NullReferenceException.Özel durum oluşturan kodu içinde değil bir Try blok.Bu nedenle, CreateException yöntemi bir özel durum işlemiyor.RunSample Yöntemi özel durum nedeniyle ele çağrısı CreateException yöntemi ise bir Try blok.
Örnek içerir Catch özel durumlar, çeşitli türlerde ifadeleri sıralı en özgü en genel.
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
Aşağıdaki örnek, nasıl kullanılacağını gösterir bir Catch When koşullu deyim üzerinde filtre ifadesi.Koşullu deyim olarak değerlendirilirse True, kod, Catch engellemek çalıştırı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
Aşağıdaki örnek olan bir Try…Catch içinde yer alan ifade bir Try blok.İç Catch blok olan bir istisna, InnerException durumun özelliği.Dış Catch kendi özel durumunu ve iç özel durum bloğu 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
Aşağıdaki örnekte, özel durum için zaman uyumsuz yöntem gösterilmektedir.Zaman uyumsuz göreve uygulanan bir özel durumu yakalamak için Await ifadesidir bir Try arayan ve özel durum bloğu yakalandı Catch blok.
Yorumsuz Throw New Exception özel durum işlemenin göstermek için örnekteki satır.Özel durum yakalandı Catch engellemek, görevin IsFaulted özelliği ayarlanmış Trueve görevin Exception.InnerException istisnası özelliğini ayarlayın.
Yorumsuz Throw New OperationCancelledException bir zaman uyumsuz işlem iptal ettiğinizde ne olacağını göstermek için satır.Özel durum yakalandı Catch blok ve görevin IsCanceled özelliği ayarlanmış True.Ancak, bu örnek için uygulama bazı koşullar altında IsFaulted ayarlamak True ve IsCanceled ayarlamak 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
Burada birden çok görevi birden çok özel duruma neden olabilir özel durum işlemenin aşağıdaki örnekte gösterilmiştir.Try Bloğu var Await görev için ifade, Task.WhenAll verdi.Üç olduğu görevler, görev tamamlandığında, Task.WhenAll uygulanan tamamlandığında.
Her üç görev, bir özel durum oluşur.Catch Blok dolaşır bulunan özel durumlar boyunca Exception.InnerExceptions görev özelliği, Task.WhenAll verdi.
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.
Başvuru
On Error Deyimi (Visual Basic)