Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve a try...with expressão, a expressão usada para tratamento de exceções em F#.
Sintaxe
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Observações
A try...with expressão é usada para lidar com exceções em F#. É semelhante à instrução try...catch em C#. Na sintaxe anterior, o código na expressão1 pode gerar uma exceção. A try...with expressão retorna um valor. Se nenhuma exceção for gerada, toda a expressão retornará o valor de expression1. Se uma exceção for gerada, cada padrão será comparado por sua vez com a exceção e, para o primeiro padrão correspondente, a expressão correspondente, conhecida como manipulador de exceção, para esse branch é executada e a expressão geral retorna o valor da expressão nesse manipulador de exceção. Se nenhum padrão corresponder, a exceção propagará a pilha de chamadas até que um manipulador correspondente seja encontrado. Os tipos dos valores retornados de cada expressão nos manipuladores de exceção devem corresponder ao tipo retornado da expressão no try bloco.
Com frequência, o fato de ocorrer um erro também significa que não há nenhum valor válido que possa ser retornado das expressões em cada manipulador de exceção. Um padrão frequente é fazer com que o tipo da expressão seja um tipo de opção. O exemplo de código a seguir ilustra esse padrão.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
As exceções podem ser exceções do .NET ou podem ser exceções F#. Você pode definir exceções de F# usando a exception palavra-chave.
Você pode usar uma variedade de padrões para filtrar no tipo de exceção e em outras condições; as opções são resumidas na tabela a seguir.
| Padrão | Descrição |
|---|---|
| :? tipo de exceção | Corresponde ao tipo de exceção .NET especificado. |
| :? tipo de exceção como identificador | Corresponde ao tipo de exceção .NET especificado, mas fornece à exceção um valor nomeado. |
| exception-name(arguments) | Corresponde a um tipo de exceção F# e associa os argumentos. |
| identificador | Corresponde a qualquer exceção e associa o nome ao objeto de exceção. Equivalente a :? System.Exception comoidentificador |
| identificador quando condição | Corresponderá a qualquer exceção se a condição for verdadeira. |
Exemplos
Os exemplos de código a seguir ilustram o uso dos vários padrões de manipulador de exceção.
// 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
Observação
O try...with constructo é uma expressão separada da try...finally expressão. Portanto, se o código exigir um with bloco e um finally bloco, você terá que aninhar as duas expressões.
Observação
Você pode usar try...with em expressões assíncronas, expressões de tarefa e outras expressões de computação, nesse caso, uma versão personalizada da try...with expressão é usada. Para obter mais informações, consulte Expressões assíncronas, expressões de tarefa e expressões de computação.