let with_file op opname cl func filename =
  let ch = try op filename with | e -> error ~opn: opname ~fn: filename ~e
  in try let r = func ch in (cl ch; r) with | e -> (cl ch; raise e)