Excepciones: la expresión try...finally (F#)

La expresión try...finally permite ejecutar código de limpieza aunque un bloque de código inicie una excepción.

try
   expression1
finally
   expression2

Comentarios

La expresión try...finally se puede utilizar para ejecutar el código de expression2 de la sintaxis anterior sin tener en cuenta si se ha generado una excepción durante la ejecución de expression1.

El tipo de expression2 no contribuye al valor de la expresión en su conjunto; el tipo devuelto cuando no se produce una excepción es el último valor de expression1.Cuando la excepción sí se produce, no se devuelve ningún valor y el flujo de control se transfiere al siguiente controlador de excepciones coincidente que aparece más arriba en la pila de llamadas.Si no se encuentra ningún controlador de excepciones, el programa finaliza.Antes de que se ejecute el código de un controlador coincidente o de que finalice el programa, se ejecuta el código de la bifurcación finally.

En el código siguiente se muestra el uso de la expresión try...finally.

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

La salida que aparece en la consola es la siguiente.

Closing stream
Exception handled.

Como puede ver en la salida, la secuencia se cerró antes de que se controlara la excepción exterior, y el archivo test.txt contiene el texto test1, lo que indica que los búferes se vaciaron y escribieron en el disco aunque la excepción transfirió el control al controlador de excepciones exterior.

Tenga en cuenta que la construcción try...with es una construcción independiente de la construcción try...finally.Por consiguiente, si el código requiere un bloque with y un bloque finally, se deberán anidar las dos construcciones, como en el ejemplo de código siguiente.

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

En el contexto de las expresiones de cálculo, incluidas las expresiones de secuencia y los flujos de trabajo asincrónicos, las expresiones try...finally pueden tener una implementación personalizada.Para obtener más información, vea Expresiones de cálculo (F#).

Vea también

Referencia

Excepciones: la expresión try...with (F#)

Otros recursos

Control de excepciones (F#)