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.
Topik ini menjelaskan try...with ekspresi, ekspresi yang digunakan untuk penanganan pengecualian di F#.
Sintaksis
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Komentar
Ekspresi try...with digunakan untuk menangani pengecualian di F#. Ini mirip try...catch dengan pernyataan dalam C#. Dalam sintaks sebelumnya, kode dalam ekspresi1 mungkin menghasilkan pengecualian. Ekspresi try...with mengembalikan nilai. Jika tidak ada pengecualian yang dilemparkan, seluruh ekspresi mengembalikan nilai ekspresi1. Jika pengecualian dilemparkan, setiap pola dibandingkan pada gilirannya dengan pengecualian, dan untuk pola pencocokan pertama, ekspresi yang sesuai, yang dikenal sebagai handler pengecualian, untuk cabang tersebut dijalankan, dan ekspresi keseluruhan mengembalikan nilai ekspresi dalam handler pengecualian tersebut. Jika tidak ada pola yang cocok, pengecualian menyebarkan tumpukan panggilan hingga handler yang cocok ditemukan. Jenis nilai yang dikembalikan dari setiap ekspresi dalam handler pengecualian harus cocok dengan jenis yang dikembalikan dari ekspresi di try blok.
Sering kali, fakta bahwa kesalahan terjadi juga berarti bahwa tidak ada nilai valid yang dapat dikembalikan dari ekspresi di setiap handler pengecualian. Pola yang sering adalah memiliki jenis ekspresi menjadi jenis opsi. Contoh kode berikut mengilustrasikan pola ini.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
Pengecualian dapat berupa pengecualian .NET, atau dapat berupa pengecualian F#. Anda dapat menentukan pengecualian F# dengan menggunakan exception kata kunci.
Anda dapat menggunakan berbagai pola untuk memfilter jenis pengecualian dan kondisi lainnya; opsi dirangkum dalam tabel berikut.
| Pola | Deskripsi |
|---|---|
| :? jenis pengecualian | Cocok dengan jenis pengecualian .NET yang ditentukan. |
| :? jenis pengecualian sebagai pengidentifikasi | Cocok dengan jenis pengecualian .NET yang ditentukan, tetapi memberikan pengecualian nilai bernama. |
| exception-name(argumen) | Cocok dengan jenis pengecualian F# dan mengikat argumen. |
| pengidentifikasi | Cocok dengan pengecualian apa pun dan mengikat nama ke objek pengecualian. Setara dengan :? System.Exception sebagaipengidentifikasi |
| pengidentifikasi ketika kondisi | Cocok dengan pengecualian apa pun jika kondisinya benar. |
Contoh
Contoh kode berikut mengilustrasikan penggunaan berbagai pola handler pengecualian.
// This example shows the use of the as keyword to assign a name to a
// .NET exception.
let divide2 x y =
try
Some( x / y )
with
| :? System.DivideByZeroException as ex -> printfn "Exception! %s " (ex.Message); None
// This version shows the use of a condition to branch to multiple paths
// with the same exception.
let divide3 x y flag =
try
x / y
with
| ex when flag -> printfn "TRUE: %s" (ex.ToString()); 0
| ex when not flag -> printfn "FALSE: %s" (ex.ToString()); 1
let result2 = divide3 100 0 true
// This version shows the use of F# exceptions.
exception Error1 of string
exception Error2 of string * int
let function1 x y =
try
if x = y then raise (Error1("x"))
else raise (Error2("x", 10))
with
| Error1(str) -> printfn "Error1 %s" str
| Error2(str, i) -> printfn "Error2 %s %d" str i
function1 10 10
function1 9 2
Nota
Konstruksi try...with adalah ekspresi terpisah dari try...finally ekspresi. Oleh karena itu, jika kode Anda memerlukan with blok dan finally blok, Anda harus menumpuk dua ekspresi.
Nota
Anda dapat menggunakan try...with dalam ekspresi asinkron, ekspresi tugas, dan ekspresi komputasi lainnya, dalam hal ini versi try...with ekspresi yang dikustomisasi digunakan. Untuk informasi selengkapnya, lihat Ekspresi Asinkron, Ekspresi Tugas, dan Ekspresi Komputasi.