Sdílet prostřednictvím


Výjimky: Pokuste... nakonec výraz (F#)

try...finally Výraz umožňuje spuštění kódu čištění, i v případě, že blok kódu výjimku.

try
   expression1
finally
   expression2

Poznámky

try...finally Výraz lze použít ke spuštění kódu v expression2 v předchozím syntaxi bez ohledu na to, zda je generována výjimka při provádění expression1.

Typ expression2 nepřispívá k hodnotě celého výrazu; Typ vrácena v případě, že nedochází k výjimce je poslední hodnota v expression1.Dojde k výjimce, není vrácena žádná hodnota a tok řízení přenáší na další odpovídající popisovač výjimky až zásobníku volání.Zpracování výjimek je nalezen, program se ukončí.Před kód odpovídající obslužné rutiny se spustí nebo ukončí program kód v finally pobočkové sítě je spuštěn.

Následující kód ukazuje použití try...finally výraz.

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

Výstup do konzoly je takto.

Closing stream
Exception handled.

Jak je vidět z výstupu, datový proud byl uzavřen před vnější výjimka byla zpracována a soubor test.txt obsahuje text test1, která označuje, že byly vyrovnávacích pamětí vyprázdněna a zapsat na disk, i když výjimky přenesena na popisovač výjimky vnější ovládací prvek.

Všimněte si, že try...with konstrukci je samostatná konstrukce z try...finally konstrukci.Proto pokud kód vyžaduje jak with bloku a finally blok, máte dvě konstrukce, jako v následujícím příkladu kódu vnořit.

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

V rámci výpočtu výrazy, včetně pořadí výrazů a asynchronní pracovní postupy, try...finally výrazy mohou mít vlastní implementaci.Další informace naleznete v tématu Výpočet výrazy (F#).

Viz také

Referenční dokumentace

Výjimky: Pokuste se výraz (F#)...

Další zdroje

Zpracování (F#) výjimek