Exceções: O bloco try... finalmente expressão (F#)
O try...finally expressão permite que você executar o código de limpeza, mesmo se um bloco de código lança uma exceção.
try
expression1
finally
expression2
Comentários
O try...finally expressão pode ser usada para executar o código em expression2 na sintaxe anterior, independentemente de se uma exceção é gerada durante a execução de expression1.
O tipo de expression2 não contribui para o valor da expressão inteira; o tipo retornado quando não ocorre uma exceção é o último valor expression1. Quando ocorre uma exceção, nenhum valor é retornado e o fluxo de controle transfere para o próximo manipulador de exceção correspondente na pilha de chamada. Não se for encontrado nenhum manipulador de exceção, encerra o programa. Antes do código em um manipulador de correspondência é executado ou o programa termina, o código de finally ramificação é executada.
O código a seguir demonstra o uso de try...finally expressão.
let divide x y =
let stream : System.IO.FileStream = System.IO.File.Create("test.txt")
let writer : System.IO.StreamWriter = new System.IO.StreamWriter(stream)
try
writer.WriteLine("test1");
Some( x / y )
finally
writer.Flush()
printfn "Closing stream"
stream.Close()
let result =
try
divide 100 0
with
| :? System.DivideByZeroException -> printfn "Exception handled."; None
A saída para o console é o seguinte.
Closing stream
Exception handled.
Como você pode ver na saída, o fluxo foi fechado antes que a exceção externa foi tratada e o arquivo test.txt contém o texto test1, que indica que os buffers foram liberados e gravados em disco, mesmo que a exceção transferiu o controle para o manipulador de exceção externa.
Observe que o try...with construção é uma construção separada a partir de try...finally construção. Portanto, se seu código requer que ambos um with bloco e um finally bloco, você tem que aninhar duas construções, como no seguinte exemplo de código.
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
No contexto das expressões de computação, incluindo expressões de seqüência e fluxos de trabalho assíncronos, try...finally expressões podem ter uma implementação personalizada. Para obter mais informações, consulte Expressões de computação (F#).
Consulte também
Referência
Exceções: O bloco try... com a expressão (F#)