Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.