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