Wyjątki: try...finally — Wyrażenie (F#)

try...finally Wyrażenie umożliwia wykonanie kodu oczyszczania, nawet jeśli blok kodu zgłasza wyjątek.

try
   expression1
finally
   expression2

Uwagi

try...finally Wyrażenie umożliwia wykonanie kodu w expression2 w poprzednim składni, niezależnie od tego, czy wyjątek jest generowany podczas wykonywania expression1.

Typ expression2 nie przyczynia się do wartości całe wyrażenie; zwrócone, gdy wyjątek nie występuje, jest to ostatnia wartość w expression1.Po wystąpieniu wyjątku, zwracana jest wartość nie, a przepływ sterowania przenosi do następnego dopasowania obsługi wyjątków w górę stosu wywołań.Jeśli zostanie znaleziony żaden moduł obsługi wyjątku, program kończy działanie.Przed wykonywany jest kod obsługi pasujące lub program kończy działanie, kod w finally jest wykonywana w oddziale firmy.

Poniższy kod demonstruje użycie try...finally wyrażenie.

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

Dane wyjściowe do konsoli jest następująca:

Closing stream
Exception handled.

Jak widać z danych wyjściowych, strumień został zamknięty przed zewnętrznym wyjątek został obsłużony, jak i plik test.txt zawiera tekst test1, która wskazuje, że bufory zostały opróżnione i zapisywane na dysku, nawet jeśli wyjątek przekazany obsługi wyjątków zewnętrznej kontroli.

Należy zauważyć, że try...with konstrukcji jest oddzielne konstrukcje z try...finally skonstruować.W związku z tym jeśli kod wymaga zarówno with bloku i finally blok, masz zagnieździć dwie konstrukcje, jak w poniższym przykładzie kodu.

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

W kontekście wyrażenia obliczeń, łącznie z sekwencji wyrażeń i asynchroniczne przepływy pracy, try...finally wyrażenia mogą mieć niestandardowej implementacji.Aby uzyskać więcej informacji, zobacz Wyrażenia obliczeń (F#).

Zobacz też

Informacje

Wyjątki: try...with — Wyrażenie (F#)

Inne zasoby

Obsługa wyjątków (F#)