Výjimky: Vyvolání a opětovné vytváření funkcí

  • Funkce raise se používá k označení, že došlo k chybě nebo mimořádné podmínce. Informace o chybě jsou zaznamenány v objektu výjimky.
  • Funkce reraise se používá k šíření zpracovávané výjimky do řetězu volání.

Syntaxe

raise (expression)

Poznámky

Funkce raise vygeneruje objekt výjimky a zahájí proces odvíjení zásobníku. Proces odvíjení zásobníku spravuje modul CLR (Common Language Runtime), takže chování tohoto procesu je stejné jako v jiném jazyce .NET. Proces odvíjení zásobníku je hledání obslužné rutiny výjimky, která odpovídá vygenerované výjimce. Hledání začíná v aktuálním try...with výrazu, pokud existuje. Každý vzor v with bloku je vrácen se změnami v pořadí. Při nalezení odpovídající obslužné rutiny výjimky je výjimka považována za zpracována; v opačném případě je zásobník unwound a with blokuje řetěz volání jsou kontrolovány, dokud se nenajde odpovídající obslužná rutina. Všechny finally bloky, ke kterým dochází v řetězci volání, se také spouštějí postupně, protože se zásobník odvíjí.

Funkce raise je ekvivalentem throw v jazyce C# nebo C++.

Následující příklady kódu ilustrují použití raise funkce k vygenerování výjimky.

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

Funkci raise lze také použít k vyvolání výjimek .NET, jak je znázorněno v následujícím příkladu.

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

Reraising an exception

Funkci reraise lze použít v with bloku k rozšíření zpracovávané výjimky do řetězu volání. reraise nebere operand výjimky. Nejužitečnější je, když metoda předá argument z volajícího do jiné metody knihovny a metoda knihovny vyvolá výjimku, která musí být předána volajícímu.

Funkci reraise nelze použít v with bloku trywith/konstruktorů ve vypočítaných seznamech, polích, sekvencích nebo výpočetních výrazech včetně task { .. } nebo .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@()

Viz také