Excepciones: la expresión try...with (F#)
En este tema se describe la expresión try...with, que se utiliza para el control de excepciones en el lenguaje F#.
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Comentarios
La expresión try...with se utiliza para controlar excepciones en F#. Es similar a la instrucción try...catch en C#. En la sintaxis anterior, el código de expression1 podría generar una excepción. La expresión try...with devuelve un valor. Si no se inicia ninguna excepción, la expresión completa devuelve el valor de expression1. Si se inicia una excepción, pattern se compara a su vez con la excepción y, para el primer modelo coincidente, se ejecuta la expression correspondiente, denominada controlador de excepciones, para esa bifurcación; a continuación, la expresión en su conjunto devuelve el valor de la expresión de ese controlador de excepciones. Si ningún modelo coincide, la excepción se propaga ascendiendo por la pila de llamadas hasta que encuentra un controlador coincidente. Los tipos de los valores devueltos por cada expresión de los controladores de excepciones deben coincidir con el tipo devuelto por la expresión en el bloque try.
Con frecuencia, el hecho que un se produzca error también significa que no hay ningún valor válido que se pueda devolver en las expresiones de cada controlador de excepciones. Un modelo frecuente es que el tipo de la expresión sea un tipo de opción. En el siguiente ejemplo de código se muestra este modelo.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
Las excepciones pueden ser de excepciones de .NET o excepciones de F#. Se pueden definir excepciones de F# mediante la palabra clave exception.
Se pueden utilizar diversos modelos para filtrar según el tipo de excepción y otras condiciones; las opciones se resumen en la tabla siguiente.
Modelo |
Descripción |
---|---|
:? exception-type |
Halla la coincidencia con el tipo de excepción de .NET especificado. |
:? exception-type as identifier |
Halla la coincidencia con el tipo de excepción de .NET especificado, pero da un valor con nombre a la excepción. |
exception-name(arguments) |
Halla la coincidencia con un tipo de excepción de F# y enlaza los argumentos. |
identifier |
Halla la coincidencia con cualquier excepción y enlaza el nombre al objeto de excepción. Equivalente a :? System.Exception as identificador |
identifier when condition |
Halla la coincidencia con cualquier excepción si la condición se cumple. |
Ejemplos
En los ejemplos de código siguientes se muestra el uso de los distintos modelos de controlador de excepciones.
// This example shows the use of the as keyword to assign a name to a
// .NET exception.
let divide2 x y =
try
Some( x / y )
with
| :? System.DivideByZeroException as ex -> printfn "Exception! %s " (ex.Message); None
// This version shows the use of a condition to branch to multiple paths
// with the same exception.
let divide3 x y flag =
try
x / y
with
| ex when flag -> printfn "TRUE: %s" (ex.ToString()); 0
| ex when not flag -> printfn "FALSE: %s" (ex.ToString()); 1
let result2 = divide3 100 0 true
// This version shows the use of F# exceptions.
exception Error1 of string
exception Error2 of string * int
let function1 x y =
try
if x = y then raise (Error1("x"))
else raise (Error2("x", 10))
with
| Error1(str) -> printfn "Error1 %s" str
| Error2(str, i) -> printfn "Error2 %s %d" str i
function1 10 10
function1 9 2
Nota
La construcción try...with es una construcción independiente de la expresión try...finally. Por consiguiente, si el código requiere tanto un bloque with como un bloque finally, se deberán anidar ambas expresiones.
Nota
Se puede utilizar try...with en flujos de trabajo asincrónicos y otras expresiones de cálculo, en cuyo caso se utiliza una versión personalizada de la expresión try...with. Para obtener más información, vea Flujos de trabajo asincrónicos (F#) y Expresiones de cálculo (F#).
Vea también
Referencia
Excepciones: la expresión try...finally (F#)