Bagikan melalui


Pengecualian: Percobaan... ekspresi akhirnya

Ekspresi memungkinkan try...finally Anda menjalankan kode pembersihan meskipun blok kode melemparkan pengecualian.

Sintaksis

try
    expression1
finally
    expression2

Komentar

Ekspresi try...finally dapat digunakan untuk menjalankan kode dalam ekspresi2 dalam sintaks sebelumnya terlepas dari apakah pengecualian dihasilkan selama eksekusi ekspresi1.

Jenis ekspresi2 tidak berkontribusi pada nilai seluruh ekspresi; jenis yang dikembalikan ketika pengecualian tidak terjadi adalah nilai terakhir dalam ekspresi1. Ketika pengecualian terjadi, tidak ada nilai yang dikembalikan dan alur kontrol ditransfer ke handler pengecualian yang cocok berikutnya ke tumpukan panggilan. Jika tidak ada handler pengecualian yang ditemukan, program akan dihentikan. Sebelum kode dalam handler yang cocok dijalankan atau program berakhir, kode di finally cabang dijalankan.

Kode berikut menunjukkan penggunaan try...finally ekspresi.

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

Output ke konsol adalah sebagai berikut.

Closing stream
Exception handled.

Seperti yang Anda lihat dari output, aliran ditutup sebelum pengecualian luar ditangani, dan file test.txt berisi teks test1, yang menunjukkan bahwa buffer dibersihkan dan ditulis ke disk meskipun pengecualian ditransfer kontrol ke handler pengecualian luar.

Perhatikan bahwa try...with konstruksi adalah konstruksi terpisah dari try...finally konstruksi. Oleh karena itu, jika kode Anda memerlukan with blok dan finally blok, Anda harus menumpuk dua konstruksi, seperti dalam contoh kode berikut.

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

Dalam konteks ekspresi komputasi, termasuk ekspresi urutan dan ekspresi asinkron, coba... akhirnya ekspresi dapat memiliki implementasi kustom. Untuk informasi selengkapnya, lihat Ekspresi Komputasi.

Lihat juga