Bagikan melalui


Pengecualian: Percobaan... dengan Ekspresi

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.

Lihat juga