Wyjątki: wywoływanie i ponowne uzyskiwanie funkcji
- Funkcja
raise
służy do wskazywania, że wystąpił błąd lub wyjątkowy warunek. Informacje o błędzie są przechwytywane w obiekcie wyjątku. - Funkcja
reraise
jest używana do propagowania obsługiwanego wyjątku w łańcuchu wywołań.
Składnia
raise (expression)
Uwagi
Funkcja raise
generuje obiekt wyjątku i inicjuje proces odwijania stosu. Proces odwijania stosu jest zarządzany przez środowisko uruchomieniowe języka wspólnego (CLR), więc zachowanie tego procesu jest takie samo jak w innym języku platformy .NET. Proces odwijania stosu jest wyszukiwaniem procedury obsługi wyjątków zgodnej z wygenerowanym wyjątkiem. Wyszukiwanie rozpoczyna się w bieżącym try...with
wyrażeniu, jeśli istnieje. Każdy wzorzec w with
bloku jest sprawdzany w kolejności. Po znalezieniu zgodnego programu obsługi wyjątków wyjątek jest uznawany za obsłużony; w przeciwnym razie stos jest niezwiązany i with
blokuje łańcuch wywołań do momentu znalezienia zgodnej procedury obsługi. Wszystkie finally
bloki napotkane w łańcuchu wywołań są również wykonywane w sekwencji podczas odwijnięcia stosu.
Funkcja raise
jest odpowiednikiem throw
języka C# lub C++.
Poniższe przykłady kodu ilustrują użycie raise
funkcji do wygenerowania wyjątku.
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
Funkcja raise
może również służyć do zgłaszania wyjątków platformy .NET, jak pokazano w poniższym przykładzie.
let divide x y =
if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
else
x / y
Reraising an exception (Ponowne uzyskiwanie wyjątku)
Funkcja reraise
może służyć w with
bloku do propagowania obsługiwanego wyjątku w łańcuchu wywołań.
reraise
nie przyjmuje operandu wyjątku. Jest to najbardziej przydatne, gdy metoda przekazuje argument z obiektu wywołującego do innej metody biblioteki, a metoda biblioteki zgłasza wyjątek, który musi zostać przekazany do obiektu wywołującego.
Funkcja reraise
nie może być używana w with
bloku try
with
/konstrukcji na obliczonych listach, tablicach, sekwencjach lub wyrażeniach obliczeniowych, w tym task { .. }
lub .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@()