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

Consulte também