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 expression True ö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 Boolean olmalı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 olacaktırcatch. 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…Finally
Try
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:
veya
Catch
bloğundaTry
bir End Deyimi ile karşılaşılır.StackOverflowException veya
Catch
bloğunaTry
bir oluşturulur.
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 Try
Catch
blok içermiyorsa, bir Finally
blok içermelidir.
İpucu
Belirli özel durumlara ihtiyacınız catch yoksa, Using
deyimi bir Try…Finally
blok gibi davranır ve blokta 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 Exception
bir öğ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:
Çalışma zamanında özel durumları yakalamak 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 catch iki özel durum türü için, görevle ilişkili ifadeyi Await
bir Try
blokta, catch özel durumu da bloğuna Catch
yerleştirin. 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ı
Bir 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ı yoktur catch . 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ı Sub
bir 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
bunu etkinleştirir Try...Catch
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 NullReferenceException
oluş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. catch Zaman uyumsuz bir göreve uygulanan bir özel durum için, Await
ifade çağıranın bloğundadır Try
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ış True
ve 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 True
ayarlanmış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 Try
Await
, 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