Pengecualian: Ekspresi try...with

Topik ini menjelaskan ekspresi try...with, ekspresi yang digunakan untuk penanganan pengecualian di F#.

Sintaks

try
    expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...

Keterangan

Ekspresi try...with digunakan untuk menangani pengecualian di F#. Ini mirip dengan pernyataan try...catch dalam C#. Dalam sintaks sebelumnya, kode dalam expression1 mungkin menghasilkan pengecualian. Ekspresi try...with mengembalikan nilai. Jika tidak ada pengecualian yang dilemparkan, keseluruhan ekspresi mengembalikan nilai expression1. Jika pengecualian dilemparkan, setiap pola akan dibandingkan pada gilirannya dengan pengecualian, dan untuk pola pencocokan pertama, ekspresi yang sesuai, yang dikenal sebagai penanganan pengecualian, untuk cabang tersebut dijalankan, dan ekspresi keseluruhan mengembalikan nilai ekspresi dalam penanganan pengecualian tersebut. Jika tidak ada pola yang cocok, pengecualian menyebarkan tumpukan panggilan hingga penanganan yang cocok ditemukan. Jenis nilai yang dikembalikan dari setiap ekspresi dalam penanganan pengecualian harus cocok dengan jenis yang dikembalikan dari ekspresi di blok try.

Sering kali, fakta bahwa kesalahan terjadi juga menandakan bahwa tidak ada nilai valid yang dapat dikembalikan dari ekspresi di setiap penanganan pengecualian. Pola yang sering adalah dengan memiliki jenis ekspresi agar menjadi jenis opsi. Contoh kode berikut menggambarkan 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 kata kunci exception.

Anda dapat menggunakan berbagai pola untuk memfilter jenis pengecualian dan kondisi lainnya; opsinya diringkas dalam tabel berikut.

Pola Deskripsi
:? exception-type Cocok dengan jenis pengecualian .NET yang ditentukan.
:? exception-type as identifier Cocok dengan jenis pengecualian .NET yang ditentukan, tetapi memberikan pengecualian nilai bernama.
exception-name(arguments) Cocok dengan jenis pengecualian F# dan mengikat argumen.
identifier Cocok dengan pengecualian apa pun dan mengikat nama ke objek pengecualian. Setara dengan :? System.Exception asidentifier
identifier when condition Cocok dengan pengecualian apa pun jika kondisinya benar.

Contoh

Contoh kode berikut mengilustrasikan penggunaan berbagai pola penanganan 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

Catatan

Konstruksi try...with merupakan ekspresi yang terpisah dari ekspresi try...finally. Oleh karena itu, jika kode Anda memerlukan blok with dan blok finally, Anda harus melapis kedua ekspresi tersebut.

Catatan

Anda dapat menggunakan try...with dalam ekspresi asinkron, ekspresi tugas dan ekspresi komputasi lainnya, dalam hal ini menggunakan versi ekspresi try...with yang dikustomisasi. Untuk informasi selengkapnya, lihat Ekspresi Asinkron, Ekspresi Tugas, dan Ekspresi komputasi.

Lihat juga