Özel Durumlar: try...finally İfadesi
ifadesi, try...finally
bir kod bloğu özel durum oluştursa bile temizleme kodu yürütmenizi sağlar.
Sözdizimi
try
expression1
finally
expression2
Açıklamalar
İfade, try...finally
ifade1'in yürütülmesi sırasında bir özel durum oluşturulup oluşturulmadığına bakılmaksızın yukarıdaki söz diziminde ifade2 içindeki kodu yürütmek için kullanılabilir.
İfade2 türü tüm ifadenin değerine katkıda bulunmaz; özel durum oluşmadığında döndürülen tür ifade1'deki son değerdir. Bir özel durum oluştuğunda hiçbir değer döndürülür ve denetim akışı çağrı yığınındaki bir sonraki eşleşen özel durum işleyicisine aktarılır. Hiçbir özel durum işleyicisi bulunmazsa, program sonlandırılır. Eşleşen bir işleyicideki kod yürütülmeden veya program sonlandırilmeden önce daldaki finally
kod yürütülür.
Aşağıdaki kod, ifadenin try...finally
kullanımını gösterir.
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
Konsolun çıkışı aşağıdaki gibidir.
Closing stream
Exception handled.
Çıktıdan görebileceğiniz gibi, dış özel durum işlenmeden önce akış kapatıldı ve dosya test.txt
, özel durum denetimi dış özel durum işleyicisine aktarılmış olsa bile arabelleklerin temizlendiğini ve diske yazıldığını gösteren metnini test1
içerir.
Yapısının try...with
yapıdan try...finally
ayrı bir yapı olduğunu unutmayın. Bu nedenle, kodunuz hem blok with
hem de blok finally
gerektiriyorsa, aşağıdaki kod örneğinde olduğu gibi iki yapıyı iç içe yerleştirmeniz 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
Dizi ifadeleri ve zaman uyumsuz ifadeler de dahil olmak üzere hesaplama ifadeleri bağlamında. .. finally ifadeleri özel bir uygulamaya sahip olabilir. Daha fazla bilgi için bkz . Hesaplama İfadeleri.