Exceções: A tentativa... com Expressão
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 manipular exceções em F#. É semelhante à try...catch
instrução em C#. Na sintaxe anterior, o código em expression1 pode gerar uma exceção. A try...with
expressão retorna um valor. Se nenhuma exceção for lançada, a expressão inteira retornará o valor de expression1. Se uma exceção for lançada, cada padrão será comparado sucessivamente com a exceção e, para o primeiro padrão correspondente, a expressão correspondente, conhecida como manipulador de exceção, para essa ramificação será executada e a expressão geral retornará o valor da expressão nesse manipulador de exceções. 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 .
Frequentemente, o fato de que ocorreu 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 do F#. Você pode definir exceções de F# usando a exception
palavra-chave.
Você pode usar uma variedade de padrões para filtrar o tipo de exceção e outras condições; As opções estão resumidas na tabela a seguir.
Padrão | Description |
---|---|
:? 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 dá à exceção um valor nomeado. |
nome-exceção(argumentos) | Corresponde a um tipo de exceção F# e vincula os argumentos. |
identificador | Corresponde a qualquer exceção e vincula o nome ao objeto de exceção. Equivalente a :? System.Exception comoidentificador |
identificador quando condição | Corresponde 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 do manipulador de exceções.
// 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
A try...with
construção é uma expressão separada da try...finally
expressão. Portanto, se o seu código requer um with
bloco e um finally
bloco, você terá que aninhar as duas expressões.
Nota
Você pode usar try...with
expressões assíncronas, expressões de tarefa e outras expressões de computação, caso em que 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.