Skip to content

Weird try/with/finally behavior in monad CE #137

Closed
@cmeeren

Description

@cmeeren

It doesn't seem that try catches exceptions. Repro (using xUnit and Unquote):

/// Helper type for simulating side effects.
type Trigger() =
  let mutable isTriggered = false
  member __.Trigger () = isTriggered <- true
  member __.Triggered = isTriggered

[<Fact>]
let ``behavior of try-with-finally when thrown`` () =
  let tTry = Trigger()
  let tCatch = Trigger()
  let tFinally = Trigger()

  let result = monad {
    try
      try
        failwith ""
        tTry.Trigger()
      with _ -> tCatch.Trigger()
    finally tFinally.Trigger()
  }
  test <@ result = Ok () @>
  test <@ not tTry.Triggered @>
  test <@ tCatch.Triggered @>
  test <@ tFinally.Triggered @>

None of the unquote tests are checked, because the exception is not caught, but they do describe what should happen if the exception is caught.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions