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#)