Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] assert caught by try with _
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Yaron M. Minsky <yminsky@c...>
Subject: Re: [Caml-list] unwind-protect
I've more or less given up on this feature ever finding it's way into
the language, and I ended up writing my own, like many others.  One of
the downsides of having people write their own unwind-protect's is that
it's a tad tricky to get right.  The trick is ensuring that the cleanup
code only gets run once, even if an exception is thrown in the middle of
the cleanup.  Here's my shot at it.

        let protect ~f ~(finally: unit -> unit) =
          let result = ref None in
          try
            result := Some (f ());
            raise Exit
          with
              Exit as e ->
                finally ();
                (match !result with Some x -> x | None -> raise e)
            | e ->
                finally (); raise e

I definitely agree it would be nice to have this kind of thing in the
language, or at least in the standard library.  When we give newbies
examples of how to read a file, giving them an example that uses
unwind-protect would prevent many future file-descriptor-exhaustion
bugs.

y

On Wed, 2003-07-30 at 01:44, Jason Hickey wrote:
> A related, but pragmatic problem.  Suppose we have some imperative code, 
> and we need an "unwind-protect" operation.  Consider this code to make 
> sure a file is closed after it is used.
> 
> let with_open_file (name : string) (f : in_channel -> unit) =
>     let inc = open_in name in
>        try
>           f inc;
>           close inc
>        with
>           exn ->
>              close inc;
>              raise exn
> 
> 1. It would be wonderful to have a "finally" clause, so we don't have to 
> duplicate the close operation.  I suppose we can fake it with CamlP4, 
> but it seems better built-in.
> 
> 2. This kind of exception re-raising does not work well with stack 
> tracing (OCAMLRUNPARAM=b).  It would be very nice to add a "finally" 
> clause that did not interfere with stack tracing, or make it so that 
> re-raising would preserve the location where the exception was created.
> 
> Jason
-- 
|--------/            Yaron M. Minsky              \--------|
|--------\ http://www.cs.cornell.edu/home/yminsky/ /--------|

Open PGP --- KeyID B1FFD916 (new key as of Dec 4th)
Fingerprint: 5BF6 83E1 0CE3 1043 95D8 F8D5 9F12 B3A9 B1FF D916



-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners