, try/catch , . /, , .
type FinalizationBuilder(oncreate, onfinal) =
member __.Bind(m, f) =
oncreate(box m)
try
try
f m
with ex ->
Choice2Of2 ex.Message
finally
onfinal(box m)
member __.Return(m) = Choice1Of2 m
member __.Zero() = Choice1Of2()
COM, COM-, .
let com = new FinalizationBuilder(ignore, System.Runtime.InteropServices.Marshal.ReleaseComObject >> ignore)
:
[<EntryPoint>]
let main _ =
com {
let! app = new Excel.Application()
let! books = app.Workbooks
let! book = books.Add()
app.Quit()
} |> ignore
0
excel, printfns.
let demo = new FinalizationBuilder(printfn "Created %A", printfn "Released %A")
[<EntryPoint>]
let main _ =
demo {
let! x = 1
let! y = 2
let! z = 3
return x + y + z
} |> printfn "Result: %A"
0
:
[<EntryPoint>]
let main _ =
demo {
let! x = 1
let! y = 2
let! z = failwith "boom"
return x + y + z
} |> printfn "Result: %A"
0
, , , . GC.Collect(); GC.WaitForPendingFinalizers() , : fooobar.com/questions/139047/...