let with_alt with1 with2 (a, b) f' =
  let ok1 = ref false
  in
    try with1 a (fun r1 -> let () = ok1 := true in f' (None, r1))
    with
    | e1 -> if !ok1 then raise e1 else with2 b (fun r2 -> f' ((Some e1), r2))