Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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...finallyifade1'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ü ifadenin tamamının 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 test1iç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.