Excepciones: expresión try...with
En este tema se describe la expresión try...with
, que es la que se usa para el control de excepciones en F#.
Sintaxis
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Comentarios
La expresión try...with
se usa para controlar excepciones en F#. Es similar a la instrucción try...catch
de 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, cada patrón se compara a su vez con la excepción y, en el primer patrón coincidente, se ejecuta la expresión correspondiente, conocida como controlador de excepciones, de esa rama y la expresión general devuelve el valor de la expresión de ese controlador de excepciones. Si no hay coincidencias de patrones, la excepción propaga la pila de llamadas hasta que se encuentra un controlador coincidente. Los tipos de los valores devueltos de cada expresión de los controladores de excepciones deben coincidir con el tipo devuelto de la expresión del bloque try
.
A menudo, el hecho de que se produzca un error también significa que no hay ningún valor válido que se pueda devolver de las expresiones de cada controlador de excepciones. Un patrón frecuente es que el tipo de la expresión sea un tipo de opción. En el siguiente ejemplo código se muestra este patrón.
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 excepciones de .NET o de F#. Puede definir excepciones de F# mediante la palabra clave exception
.
Puede usar una serie de patrones para filtrar por el tipo de excepción y otras condiciones; las opciones se resumen en la tabla siguiente.
Patrón | Descripción |
---|---|
:? exception-type | Coincide con el tipo de excepción de .NET especificado. |
:? exception-type as identifier | Coincide con el tipo de excepción de .NET especificado, pero proporciona a la excepción un valor con nombre. |
exception-name(arguments) | Coincide con un tipo de excepción de F# y enlaza los argumentos. |
identifier | Coincide con cualquier excepción y enlaza el nombre al objeto de excepción. Equivalente a :? System.Exception asidentifier |
identifier when condition | Coincide con cualquier excepción si la condición es verdadera. |
Ejemplos
En los ejemplos de código siguientes se muestra el uso de los distintos patrones del 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 expresión independiente de la expresión try...finally
. Por lo tanto, si el código requiere un bloque with
y un bloque finally
, tiene que anidar las dos expresiones.
Nota
Puede usar try...with
en expresiones asincrónicas, expresiones de tareas y otras expresiones de cálculo, en cuyo caso se usa una versión personalizada de la expresión try...with
. Para obtener más información, vea Expresiones asincrónicas, Expresiones de tareas y Expresiones de cálculo.
Consulte también
- Control de excepciones
- Tipos de excepción
- Exceptions: The
try...finally
Expression (Excepciones: la expresióntry...finally
)