Özel durumlar: işlevleri yükseltme ve yeniden değerlendirme

  • raise işlevi, bir hatanın veya istisnai koşulun oluştuğuna işaret etmek için kullanılır. Hata hakkındaki bilgiler bir özel durum nesnesinde yakalanır.
  • reraise İşlev, çağrı zincirinde işlenen bir özel durumu yaymak için kullanılır.

Sözdizimi

raise (expression)

Açıklamalar

raise İşlev bir özel durum nesnesi oluşturur ve yığın geri sarma işlemini başlatır. Yığın geri sarma işlemi ortak dil çalışma zamanı (CLR) tarafından yönetilir, bu nedenle bu işlemin davranışı diğer tüm .NET dillerinde olduğu gibi aynıdır. Yığın geri sarma işlemi, oluşturulan özel durumla eşleşen bir özel durum işleyicisi için yapılan bir aramadır. Arama, varsa geçerli try...with ifadede başlar. Bloktaki with her desen sırayla denetlenir. Eşleşen bir özel durum işleyicisi bulunduğunda, özel durum işlenmiş olarak kabul edilir; aksi takdirde, yığın kaldırılır ve with eşleşen bir işleyici bulunana kadar çağrı zincirini engeller denetlenir. Çağrı zincirinde karşılaşılan tüm finally bloklar da yığın gevşedikçe sırayla yürütülür.

raise işlevi C# veya C++ ile eşdeğerdirthrow.

Aşağıdaki kod örnekleri, özel durum oluşturmak için işlevinin raise kullanımını gösterir.

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

İşlev, raise aşağıdaki örnekte gösterildiği gibi .NET özel durumlarını yükseltmek için de kullanılabilir.

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

Özel durumu yeniden değerlendirme

İşlev, reraise çağrı zincirinde işlenen bir özel durumu yaymak için bir with blokta kullanılabilir. reraise özel durum işleneni almaz. Yöntemin bir bağımsız değişkeni çağırandan başka bir kitaplık yöntemine geçirmesi ve kitaplık yönteminin çağırana geçirilmesi gereken bir özel durum oluşturması en kullanışlı yöntemdir.

İşlev, reraise veya dahil olmak üzere task { .. } hesaplanan listelerdeki, dizilerdeki, dizilerdeki veya hesaplama ifadelerindeki yapı bloğunda with/trywith kullanılamaz.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@()

Ayrıca bkz.