Bagikan melalui


Pengecualian: menaikkan dan menyusun ulang fungsi

  • Fungsi raise ini digunakan untuk menunjukkan bahwa terjadi kesalahan atau kondisi luar biasa. Informasi tentang kesalahan diambil dalam objek pengecualian.
  • Fungsi reraise ini digunakan untuk menyebarluaskan pengecualian yang ditangani hingga rantai panggilan.

Sintaksis

raise (expression)

Komentar

Fungsi ini raise menghasilkan objek pengecualian dan memulai proses unwinding tumpukan. Proses unwinding tumpukan dikelola oleh runtime bahasa umum (CLR), sehingga perilaku proses ini sama seperti dalam bahasa .NET lainnya. Proses unwinding tumpukan adalah pencarian untuk handler pengecualian yang cocok dengan pengecualian yang dihasilkan. Pencarian dimulai dalam ekspresi saat ini try...with , jika ada. Setiap pola dalam with blok diperiksa, secara berurutan. Ketika penangan pengecualian yang cocok ditemukan, pengecualian dianggap ditangani; jika tidak, tumpukan dilepas dan with memblokir rantai panggilan diperiksa sampai handler yang cocok ditemukan. Setiap finally blok yang ditemui dalam rantai panggilan juga dijalankan secara berurutan saat tumpukan melepas penat.

Fungsi raise ini setara throw dengan dalam C# atau C++.

Contoh kode berikut mengilustrasikan penggunaan raise fungsi untuk menghasilkan pengecualian.

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

Fungsi ini raise juga dapat digunakan untuk menaikkan pengecualian .NET, seperti yang ditunjukkan dalam contoh berikut.

let divide x y =
  if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
  else
     x / y

Mengurai kembali pengecualian

Fungsi reraise ini dapat digunakan dalam with blok untuk menyebarluaskan pengecualian yang ditangani hingga rantai panggilan. reraise tidak mengambil operand pengecualian. Ini paling berguna ketika metode meneruskan argumen dari pemanggil ke beberapa metode pustaka lain, dan metode pustaka menimbulkan pengecualian yang harus diteruskan ke pemanggil.

Fungsi reraise ini tidak dapat digunakan pada with blok trywith/konstruksi dalam daftar komputasi, array, urutan, atau ekspresi komputasi termasuk task { .. } atau .async { .. }

open System

let getFirstCharacter(value: string) =
    try
        value[0]
    with :? IndexOutOfRangeException as e ->
        reraise()

let s = getFirstCharacter("")
Console.WriteLine($"The first character is {s}")

// The example displays the following output:
//   System.IndexOutOfRangeException: Index was outside the bounds of the array.
//      at System.String.get_Chars(Int32 index)
//      at getFirstCharacter(String value)
//      at <StartupCode>.main@()

Lihat juga