Excepciones: expresión try...with

En este tema se describe try...with la expresión , la expresión que se usa para el control de excepciones en F#.

Sintaxis

try
    expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...

Observaciones

La try...with expresión se usa para controlar las excepciones en F#. Es similar a la try...catch instrucción en C#. En la sintaxis anterior, el código de expression1 podría generar una excepción. La try...with expresión devuelve un valor. Si no se produce ninguna excepción, toda la expresión devuelve el valor de expression1. Si se produce una excepción, cada patrón se compara a su vez con la excepción y, para el primer patrón de coincidencia, se ejecuta la expresión correspondiente , conocida como controlador de excepciones , para esa rama, y la expresión general devuelve el valor de la expresión en ese controlador de excepciones. Si no hay coincidencias de patrón, la excepción propaga la pila de llamadas hasta que se encuentra un controlador correspondiente. Los tipos de los valores devueltos de cada expresión en los controladores de excepciones deben coincidir con el tipo devuelto por la expresión en el try bloque .

Con frecuencia, el hecho de que se haya producido un error también significa que no hay ningún valor válido que se pueda devolver desde 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 ejemplo de código siguiente 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 pueden ser excepciones de F#. Puede definir excepciones de F# mediante la palabra exception clave .

Puede usar una variedad 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 como identificador 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 comoidentificador
identificador cuando condición Coincide con cualquier excepción si la condición es true.

Ejemplos

En los ejemplos de código siguientes se muestra el uso de los distintos patrones 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 try...with construcción es una expresión independiente de la try...finally expresión. Por lo tanto, si el código requiere un bloque y un bloque, tendrá with finally que anidar las dos expresiones.

Nota

Puede usar en expresiones asincrónicas, expresiones de tarea y otras expresiones de cálculo, en cuyo caso se usa una try...with versión personalizada de la try...with expresión. Para obtener más información, vea Expresiones asincrónicas, Expresiones de tareay Expresiones de cálculo.

Vea también