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
- Control de excepciones
- Tipos de excepción
- Exceptions: The
try...with
Expression (Excepciones: la expresióntry...with
) - Exceptions: The
try...finally
Expression (Excepciones: la expresióntry...finally
) - Exceptions: the
failwith
Function (Excepciones: la funciónfailwith
) - Exceptions: the
invalidArg
Function (Excepciones: la funcióninvalidArg
)