Udostępnij za pośrednictwem


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

Zobacz też