Exceções: funções raise e reraise

  • A função raise é usada para indicar que ocorreu um erro ou condição excepcional. As informações sobre o erro são capturadas em um objeto de exceção.
  • A função reraise é usada para propagar uma exceção manipulada na cadeia de chamadas.

Sintaxe

raise (expression)

Comentários

A função raise gera um objeto de exceção e inicia um processo de desenrolamento de pilha. O processo de desenrolamento da pilha é gerenciado pelo Common Language Runtime (CLR), portanto, o comportamento desse processo é o mesmo de qualquer outra linguagem .NET. O processo de desenrolamento da pilha é uma busca por um manipulador de exceção que corresponda à exceção gerada. A pesquisa começa na expressão try...with atual, se houver. Cada padrão no bloco with é verificado, em ordem. Quando um manipulador de exceção correspondente é encontrado, a exceção é considerada tratada; caso contrário, a pilha é desenrolada e os blocos with na cadeia de chamadas são verificados até que um manipulador correspondente seja encontrado. Quaisquer blocos finally encontrados na cadeia de chamadas também são executados em sequência à medida que a pilha se desenrola.

A função raise é equivalente a throw em C# ou C++.

Os exemplos de código a seguir ilustram o uso da função raise para gerar uma exceção.

exception InnerError of string
exception OuterError of string

let function1 x y =
   try
     try
        if x = y then raise (InnerError("inner"))
        else raise (OuterError("outer"))
     with
      | InnerError(str) -> printfn "Error1 %s" str
   finally
      printfn "Always print this."


let function2 x y =
  try
     function1 x y
  with
     | OuterError(str) -> printfn "Error2 %s" str

function2 100 100
function2 100 10

A função raise também pode ser usada para gerar exceções .NET, conforme mostrado no exemplo a seguir.

let divide x y =
  if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
  else
     x / y

Recriando uma exceção

A função reraise pode ser usada em um bloco with para propagar uma exceção tratada na cadeia de chamadas. reraise não recebe um operando de exceção. É mais útil quando um método passa um argumento de um chamador para algum outro método de biblioteca e o método de biblioteca gera uma exceção que deve ser passada para o chamador.

A função reraise não pode ser usada no bloco with de construções try/with em listas computadas, matrizes, sequências ou expressões computacionais incluindo task { .. } ou async { .. }.

open System

let getFirstCharacter(value: string) =
    try
        value[0]
    with :? IndexOutOfRangeException as e ->
        reraise()

let s = getFirstCharacter("")
Console.WriteLine($"The first character is {s}")

// The example displays the following output:
//   System.IndexOutOfRangeException: Index was outside the bounds of the array.
//      at System.String.get_Chars(Int32 index)
//      at getFirstCharacter(String value)
//      at <StartupCode>.main@()

Confira também