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

Ayrıca bkz.