Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describe la try...with 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 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, la expresión completa 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 coincidente, la expresión correspondiente, conocida como controlador de excepciones, para esa rama se ejecuta y la expresión general devuelve el valor de la expresión en ese controlador de excepciones. Si no hay coincidencias de patrones, la excepción propaga la pila de llamadas hasta que se encuentre un controlador coincidente. Los tipos de los valores devueltos de cada expresión en los controladores de excepciones deben coincidir con el tipo devuelto de la expresión en el try bloque .
Con frecuencia, el hecho de que se produjo 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 hacer 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 exception palabra 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.
| Modelo | Descripción |
|---|---|
| :? tipo de excepción | Coincide con el tipo de excepción de .NET especificado. |
| :? tipo de excepción 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. |
| identificador | 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
Los ejemplos de código siguientes muestran 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 with bloque y un finally bloque, tendrá 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 try...with expresión. Para obtener más información, vea Expresiones asincrónicas, expresiones de tareas y expresiones de cálculo.
Consulte también
- Manejo de Excepciones
- Tipos de excepción
-
Excepciones: la
try...finallyexpresión