Eccezioni: generare e rirazionare le funzioni

  • La raise funzione viene usata per indicare che si è verificato un errore o una condizione eccezionale. Le informazioni sull'errore vengono acquisite in un oggetto eccezione.
  • La reraise funzione viene usata per propagare un'eccezione gestita fino alla catena di chiamate.

Sintassi

raise (expression)

Osservazioni:

La raise funzione genera un oggetto eccezione e avvia un processo di rimozione dello stack. Il processo di rimozione dello stack è gestito da Common Language Runtime (CLR), quindi il comportamento di questo processo è identico a quello di qualsiasi altro linguaggio .NET. Il processo di rimozione dello stack è una ricerca di un gestore eccezioni che corrisponde all'eccezione generata. La ricerca inizia nell'espressione corrente try...with , se presente. Ogni criterio nel with blocco viene controllato, in ordine. Quando viene trovato un gestore eccezioni corrispondente, l'eccezione viene considerata gestita; in caso contrario, lo stack viene sbloccato e with blocca la catena di chiamate viene controllato fino a quando non viene trovato un gestore corrispondente. Tutti i finally blocchi rilevati nella catena di chiamate vengono eseguiti anche in sequenza durante la rimozione dello stack.

La raise funzione è l'equivalente di throw in C# o C++.

Negli esempi di codice seguenti viene illustrato l'uso della raise funzione per generare un'eccezione.

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

La raise funzione può essere usata anche per generare eccezioni .NET, come illustrato nell'esempio seguente.

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

Ripristino di un'eccezione

La reraise funzione può essere usata in un with blocco per propagare un'eccezione gestita fino alla catena di chiamate. reraise non accetta un operando di eccezione. È più utile quando un metodo passa un argomento da un chiamante a un altro metodo di libreria e il metodo di libreria genera un'eccezione che deve essere passata al chiamante.

La reraise funzione non può essere usata nel with blocco di trywith/costrutti in elenchi calcolati, matrici, sequenze o espressioni di calcolo, inclusi task { .. } o .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@()

Vedi anche