Compartir a través de


Excepciones: El intento... finally Expression

La try...finally expresión permite ejecutar código de limpieza incluso si un bloque de código produce una excepción.

Sintaxis

try
    expression1
finally
    expression2

Observaciones

La try...finally expresión se puede usar para ejecutar el código en expression2 en la sintaxis anterior, independientemente de si se genera una excepción durante la ejecución de expression1.

El tipo de expresión2 no contribuye al valor de toda la expresión; el tipo devuelto cuando no se produce una excepción es el último valor de expression1. Cuando se produce una excepción, no se devuelve ningún valor y el flujo de control transfiere al siguiente controlador de excepciones coincidente 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 finalice el programa, se ejecuta el código de la finally rama.

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

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 a la consola es la siguiente.

Closing stream
Exception handled.

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

Tenga en cuenta que la try...with construcción es una construcción independiente de la try...finally construcción. Por lo tanto, si el código requiere un with bloque y un finally bloque, debe 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 las expresiones asincrónicas, pruebe... Por último , las expresiones pueden tener una implementación personalizada. Para obtener más información, vea Expresiones de cálculo.

Consulte también