Excepciones: funciones raise y reraise

  • La función raise se usa para indicar que se ha producido un error o una condición excepcional. La información sobre el error se captura en un objeto de excepción.
  • La función reraise se usa para propagar una excepción controlada por la cadena de llamadas.

Sintaxis

raise (expression)

Comentarios

La función raise genera un objeto de excepción e inicia un proceso de desenredo de pila. El proceso de desenredo de pila se administra mediante Common Language Runtime (CLR), por lo que el comportamiento de este proceso es el mismo que en cualquier otro lenguaje .NET. El proceso de desenredo de pila es una búsqueda de un controlador de excepciones que coincide con la excepción generada. La búsqueda se inicia en la expresión try...with actual, si hay una. Cada patrón del bloque with se comprueba, en orden. Cuando se encuentra un controlador de excepciones coincidente, la excepción se considera controlada; de lo contrario, la pila se desenreda y los bloques with de la cadena de llamadas se comprueban hasta que se encuentra un controlador coincidente. Los bloques finally que se encuentran en la cadena de llamadas también se ejecutan en secuencia a medida que la pila se desenreda.

La función raise es el equivalente de throw en C# o C++.

En los ejemplos de código siguientes se muestra el uso de la función raise para generar una excepción.

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 función raise también se puede usar para generar excepciones de .NET, como se muestra en el ejemplo siguiente.

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

Regeneración de una excepción

La función reraise se puede usar en un bloque with para propagar una excepción controlada por la cadena de llamadas. reraise no toma un operando de excepción. Resulta más útil cuando un método pasa un argumento de un autor de llamada a otro método de biblioteca y el método de biblioteca produce una excepción que se debe pasar al autor de llamada.

La función reraise no se puede usar en el bloque with de construcciones de try/with en listas calculadas, matrices, secuencias o expresiones de cálculo, incluidas 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@()

Consulte también