Compartilhar via


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 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.

Consulte também