Megosztás a következőn keresztül:


Kivételek: A kísérlet... végül Kifejezés

A try...finally kifejezés lehetővé teszi a törlési kód végrehajtását akkor is, ha egy kódblokk kivételt eredményez.

Szemantika

try
    expression1
finally
    expression2

Megjegyzések

A try...finally kifejezés a kifejezés2 kódjának végrehajtására használható az előző szintaxisban, függetlenül attól, hogy a kifejezés1 végrehajtása során kivétel jön-e létre.

A kifejezés2 típusa nem járul hozzá a teljes kifejezés értékéhez; a visszaadott típus, ha egy kivétel nem történik meg, a kifejezés1 utolsó értéke. Kivétel esetén a rendszer nem ad vissza értéket, és a vezérlés átvitele a hívásverem következő egyező kivételkezelőjének lesz. Ha nem található kivételkezelő, a program leáll. Az egyező kezelőben lévő kód végrehajtása vagy a program leállása előtt a program végrehajtja az finally ágban lévő kódot.

Az alábbi kód bemutatja a kifejezés használatát 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

A konzol kimenete a következő.

Closing stream
Exception handled.

Ahogy a kimenetből látható, a stream a külső kivétel kezelése előtt lezárult, és a fájl test.txt tartalmazza a szöveget test1, ami azt jelzi, hogy a pufferek kiürítve lettek, és lemezre lettek írva, annak ellenére, hogy a kivétel átvitte a vezérlőt a külső kivételkezelőbe.

Vegye figyelembe, hogy a try...with szerkezet a szerkezettől try...finally különálló szerkezet. Ezért ha a kódhoz blokkra és finally blokkra is with szükség van, a két szerkezetet be kell ágyaznia, ahogyan az alábbi kód példában is látható.

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

Számítási kifejezések kontextusában, beleértve a sorozatkifejezéseket és az aszinkron kifejezéseket, próbálkozzon... végül a kifejezések egyéni implementációval rendelkezhetnek. További információ: Számítási kifejezések.

Lásd még