F # - Tratamento de exceções
Uma exceção é um problema que surge durante a execução de um programa. Uma exceção F # é uma resposta a uma circunstância excepcional que surge durante a execução de um programa, como uma tentativa de divisão por zero.
As exceções fornecem uma maneira de transferir o controle de uma parte de um programa para outra. O tratamento de exceções F # fornece as seguintes construções -
Construir | Descrição |
---|---|
aumentar expr | Gera a exceção fornecida. |
failwith expr | Levanta o System.Exception exceção. |
tente expr com regras | Captura expressões que correspondem às regras de padrão. |
tente expr finalmente expr | Execução do finally expressão quando o cálculo é bem-sucedido e quando uma exceção é levantada. |
| :? ArgumentException | Uma regra que corresponde ao tipo de exceção .NET fornecido. |
| :? ArgumentException as e | Uma regra que corresponde ao tipo de exceção .NET fornecido, vinculando o nome e para o valor do objeto de exceção. |
| Falha (msg) → expr | Uma regra que corresponde à exceção F # de transporte de dados fornecida. |
| exn → expr | Uma regra que corresponde a qualquer exceção, vinculando o nome exn para o valor do objeto de exceção. |
| exn quando expr → expr | Uma regra que corresponde à exceção sob a condição fornecida, vinculando o nome exn para o valor do objeto de exceção. |
Vamos começar com a sintaxe básica do Tratamento de Exceções.
Sintaxe
A sintaxe básica para o bloco de tratamento de exceções F # é -
exception exception-type of argument-type
Onde,
exception-type é o nome de um novo tipo de exceção F #.
argument-type representa o tipo de um argumento que pode ser fornecido quando você levanta uma exceção desse tipo.
Vários argumentos podem ser especificados usando um tipo de tupla para o tipo de argumento.
o try...with expressão é usada para tratamento de exceções na linguagem F #.
A sintaxe para tentar ... com expressão é -
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
o try...finally expression permite que você execute código de limpeza mesmo se um bloco de código lançar uma exceção.
Sintaxe para a tentativa ... finalmente a expressão é -
try
expression1
finally
expression2
o raiseA função é usada para indicar que ocorreu um erro ou condição excepcional. Ele também captura as informações sobre o erro em um objeto de exceção.
A sintaxe para a função de aumento é -
raise (expression)
o failwith função gera uma exceção F #.
A sintaxe para a função failwith é -
failwith error-message-string
o invalidArg função gera uma exceção de argumento.
invalidArg parameter-name error-message-string
Exemplo de tratamento de exceções
Exemplo 1
O programa a seguir mostra o tratamento básico de exceções com uma simples tentativa ... com bloco -
let divisionprog x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divisionprog 100 0
Quando você compila e executa o programa, ele produz a seguinte saída -
Division by zero!
Exemplo 2
F # fornece um exceptiontipo para declarar exceções. Você pode usar um tipo de exceção diretamente nos filtros em umtry...with expressão.
O exemplo a seguir demonstra isso -
exception Error1 of string
// Using a tuple type as the argument type.
exception Error2 of string * int
let myfunction x y =
try
if x = y then raise (Error1("Equal Number Error"))
else raise (Error2("Error Not detected", 100))
with
| Error1(str) -> printfn "Error1 %s" str
| Error2(str, i) -> printfn "Error2 %s %d" str i
myfunction 20 10
myfunction 5 5
Quando você compila e executa o programa, ele produz a seguinte saída -
Error2 Error Not detected 100
Error1 Equal Number Error
Exemplo 3
O exemplo a seguir demonstra o tratamento de exceções aninhadas -
exception InnerError of string
exception OuterError of string
let func1 x y =
try
try
if x = y then raise (InnerError("inner error"))
else raise (OuterError("outer error"))
with
| InnerError(str) -> printfn "Error:%s" str
finally
printfn "From the finally block."
let func2 x y =
try
func1 x y
with
| OuterError(str) -> printfn "Error: %s" str
func2 100 150
func2 100 100
func2 100 120
Quando você compila e executa o programa, ele produz a seguinte saída -
From the finally block.
Error: outer error
Error:inner error
From the finally block.
From the finally block.
Error: outer error
Exemplo 4
A função a seguir demonstra o failwith função -
let divisionFunc x y =
if (y = 0) then failwith "Divisor cannot be zero."
else
x / y
let trydivisionFunc x y =
try
divisionFunc x y
with
| Failure(msg) -> printfn "%s" msg; 0
let result1 = trydivisionFunc 100 0
let result2 = trydivisionFunc 100 4
printfn "%A" result1
printfn "%A" result2
Quando você compila e executa o programa, ele produz a seguinte saída -
Divisor cannot be zero.
0
25
Exemplo 5
o invalidArgfunção gera uma exceção de argumento. O programa a seguir demonstra isso -
let days = [| "Sunday"; "Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday" |]
let findDay day =
if (day > 7 || day < 1)
then invalidArg "day" (sprintf "You have entered %d." day)
days.[day - 1]
printfn "%s" (findDay 1)
printfn "%s" (findDay 5)
printfn "%s" (findDay 9)
Quando você compila e executa o programa, ele produz a seguinte saída -
Sunday
Thursday
Unhandled Exception:
System.ArgumentException: You have entered 9.
…
Algumas outras informações sobre o arquivo e a variável que causam o erro no sistema também serão exibidas, dependendo do sistema.