Compartir a través de


Excepciones: generar y reraise funciones

  • La raise función 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 reraise función se usa para propagar una excepción controlada en la cadena de llamadas.

Sintaxis

raise (expression)

Observaciones

La raise función genera un objeto de excepción e inicia un proceso de desenredado de pila. Common Language Runtime (CLR) administra el proceso de desenredado de la pila, por lo que el comportamiento de este proceso es el mismo que en cualquier otro lenguaje .NET. El proceso de desenredado 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 actual try...with , si hay una. Cada patrón del with bloque está activado, en orden. Cuando se encuentra un controlador de excepciones coincidente, la excepción se considera controlada; De lo contrario, la pila se desencadena y with se bloquea la cadena de llamadas se comprueba hasta que se encuentre un controlador coincidente. Los finally bloques que se encuentran en la cadena de llamadas también se ejecutan en secuencia a medida que la pila desenreda.

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

Los ejemplos de código siguientes muestran el uso de la raise función 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 raise función 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

Reraising an exception

La reraise función se puede usar en un with bloque para propagar una excepción controlada en 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 llamador a otro método de biblioteca y el método de biblioteca genera una excepción que se debe pasar al autor de la llamada.

Es reraise posible que la función no se use en el with bloque de construcciones de trywith/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