Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.