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 try
with
/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@()