Özel Durumlar: try...finally İfadesi
try...finallyİfade, bir kod bloğu özel durum oluşturursa bile temizleme kodu çalıştırmanızı sağlar.
Syntax
try
expression1
finally
expression2
Açıklamalar
try...finallyİfadesi, İfade1 öğesinin yürütülmesi sırasında bir özel durumun oluşturulup oluşturulmadığına bakılmaksızın, Önceki sözdiziminde İfade2 içindeki kodu yürütmek için kullanılabilir.
Deyim2 türü tüm ifadenin değerine katkıda bulunmaz; bir özel durum gerçekleşmediğinde döndürülen tür İfade1' deki son değerdir. Bir özel durum oluştuğunda, hiçbir değer döndürülmez ve denetim akışı, çağrı yığınını yukarı eşleşen bir sonraki özel durum işleyicisine aktarır. Hiçbir özel durum işleyici bulunmazsa program sonlanır. Eşleşen bir işleyicisindeki kod yürütülmeden veya program sonlandırıldığında, finally daldaki kod yürütülür.
Aşağıdaki kod, ifadesinin kullanımını gösterir try...finally .
let divide x y =
let stream : System.IO.FileStream = System.IO.File.Create("test.txt")
let writer : System.IO.StreamWriter = new System.IO.StreamWriter(stream)
try
writer.WriteLine("test1")
Some( x / y )
finally
writer.Flush()
printfn "Closing stream"
stream.Close()
let result =
try
divide 100 0
with
| :? System.DivideByZeroException -> printfn "Exception handled."; None
Konsola giden çıkış aşağıdaki gibidir.
Closing stream
Exception handled.
Çıktıdan görebileceğiniz gibi, akış, dıştaki özel durum işleninceye kadar kapatılmıştır ve dosya, test.txt test1 denetimin dıştaki özel durum işleyicisine aktarılmasının yanı sıra, arabelleğe alınmış ve diske yazıldığını belirten metni içerir.
try...withYapının yapıdan ayrı bir yapı olduğunu unutmayın try...finally . Bu nedenle, kodunuz hem with blok hem de finally blok gerektiriyorsa, aşağıdaki kod örneğinde olduğu gibi iki yapıları iç içe almanız gerekir.
exception InnerError of string
exception OuterError of string
let function1 x y =
try
try
if x = y then raise (InnerError("inner"))
else raise (OuterError("outer"))
with
| InnerError(str) -> printfn "Error1 %s" str
finally
printfn "Always print this."
let function2 x y =
try
function1 x y
with
| OuterError(str) -> printfn "Error2 %s" str
function2 100 100
function2 100 10
Sıra ifadeleri ve zaman uyumsuz ifadeler dahil hesaplama ifadeleri bağlamında, deneyin... finally ifadeleri özel bir uygulamaya sahip olabilir. Daha fazla bilgi için bkz. Hesaplama ifadeleri.