Ö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.

Ayrıca bkz.