caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [OSR] Exceptionless error management
@ 2008-01-31  8:55 Bünzli Daniel
  2008-01-31  9:57 ` [Caml-list] " Till Varoquaux
                   ` (3 more replies)
  0 siblings, 4 replies; 36+ messages in thread
From: Bünzli Daniel @ 2008-01-31  8:55 UTC (permalink / raw)
  To: caml-list List

Hello,

Based on discussions and the resulting consensus that occured more  
than once on this list. I wrote a recommendation on how modules should  
perform error management. It is available here :

http://cocan.org/osr/exceptionless_error_management

Best,

Daniel


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31  8:55 [OSR] Exceptionless error management Bünzli Daniel
@ 2008-01-31  9:57 ` Till Varoquaux
  2008-01-31 11:01   ` Bünzli Daniel
  2008-02-01  8:31 ` David Teller
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 36+ messages in thread
From: Till Varoquaux @ 2008-01-31  9:57 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

My cocan account is not created yet soo I will answer here:
_ In the thread you are pointing to Xavier did not say using
exceptions was a mistake, he said the Failure exception (such as
int_of_string) was legacy code and not great.
_ Allowing Invalid_argument seems a little to hardcore. When doing
system programming for instance there is an incredible range of
exceptional events that can happen, you are definitly not going to
handle all of them (or are you?) so you will need to let them trickle
up. This will eventually require using something akin to an error
monad and some awfull mangling with polymorpic variants.
_Exceptions are terse. Suppose Map.find returned an option type (and
this seems a sensible choice). If you were in a place where not being
in the map really was an exceptional event you'd need to unbox and do
some error handling for every lookup (and since you do not want to
raise an exception I must wonder what you would do). Not only is this
cumbersome, but it also is bound to be slow and lead to some loss of
information (no more printexc, backtrace...) unless you jump through a
lot of hoops.

Here is my take:
_You should try to keep exceptions for exceptional cases. If you think
you might need to catch them do not hesitate to create your own
exception.
_For functions like find... declare two functions: one that boxes it's
return value (i.e val input_line : in_channel -> string option) and
another that raises an exception (i.e val input_line_exn : in_channel
-> string).

Till
On Jan 31, 2008 8:55 AM, Bünzli Daniel <daniel.buenzli@erratique.ch> wrote:
> Hello,
>
> Based on discussions and the resulting consensus that occured more
> than once on this list. I wrote a recommendation on how modules should
> perform error management. It is available here :
>
> http://cocan.org/osr/exceptionless_error_management
>
> Best,
>
> Daniel
>
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>



-- 
http://till-varoquaux.blogspot.com/

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31  9:57 ` [Caml-list] " Till Varoquaux
@ 2008-01-31 11:01   ` Bünzli Daniel
  2008-01-31 14:09     ` Andrej Bauer
  0 siblings, 1 reply; 36+ messages in thread
From: Bünzli Daniel @ 2008-01-31 11:01 UTC (permalink / raw)
  To: Till Varoquaux; +Cc: caml-list List

Le 31 janv. 08 à 10:57, Till Varoquaux a écrit :

> My cocan account is not created yet soo I will answer here:

I think it is better to discuss on the list.

> _ In the thread you are pointing to Xavier did not say using
> exceptions was a mistake, he said the Failure exception (such as
> int_of_string) was legacy code and not great.

Right, corrected.

> _ Allowing Invalid_argument seems a little to hardcore. When doing
> system programming for instance there is an incredible range of
> exceptional events that can happen, you are definitly not going to
> handle all of them (or are you?) so you will need to let them trickle
> up. This will eventually require using something akin to an error
> monad and some awfull mangling with polymorpic variants.

This OSR is mainly targeted at reusable modules and it says nothing  
about clients of the module. Clients are allowed to define their own  
exceptions to propagate the error up. The contract of a conforming  
module is that it won't interfere with the client's control flow as  
long as it behaves correctly.

> _Exceptions are terse. Suppose Map.find returned an option type (and
> this seems a sensible choice). If you were in a place where not being
> in the map really was an exceptional event you'd need to unbox and do
> some error handling for every lookup (and since you do not want to
> raise an exception I must wonder what you would do).

They are terse because they are implicit and I don't like this. For me  
either not being in the map can happen and then you have to deal with  
it at each call because of program correctness either you know, e.g.  
by construction, that not being in the map cannot happen. In the  
latter case I would define the following local function :

let find map k = match Map.find map k with Some v -> v | None ->  
assert false

> _For functions like find... declare two functions: one that boxes it's
> return value (i.e val input_line : in_channel -> string option) and
> another that raises an exception (i.e val input_line_exn : in_channel
> -> string).

Requiring this clutters apis and is more work for the module  
developer. If you want a function that raises you can define your own  
local function as suggested above.

Best,

Daniel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 11:01   ` Bünzli Daniel
@ 2008-01-31 14:09     ` Andrej Bauer
  2008-01-31 14:16       ` Michael Ekstrand
  2008-01-31 20:03       ` Bünzli Daniel
  0 siblings, 2 replies; 36+ messages in thread
From: Andrej Bauer @ 2008-01-31 14:09 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: Till Varoquaux, caml-list List

Bünzli Daniel wrote:
> let find map k = match Map.find map k with Some v -> v | None -> assert 
> false

I have become to prefer option types as return values (as opposed to 
exceptions), but I admit it can be annoying to always consider both 
possibilities, especially if you know that "None" won't happen. If the 
library only provides "find" that returns an option type, the above 
solution gets around constant checking. But how much runtime overhead 
does it cause? Has anyone measured that?

What is wrong with having two functions? With a bit of imagination, we 
can give them reasonable names, e.g., get and search. Everybody can 
guess which one returns the option type and which one throws an 
exception, right?

Throwing out functionality on the grounds that it "clutters APIs" 
doesn't sound like a good idea to me. Throwing out bells and whistles is 
another matter.

Andrej


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 14:09     ` Andrej Bauer
@ 2008-01-31 14:16       ` Michael Ekstrand
  2008-01-31 19:28         ` David Teller
  2008-01-31 20:03       ` Bünzli Daniel
  1 sibling, 1 reply; 36+ messages in thread
From: Michael Ekstrand @ 2008-01-31 14:16 UTC (permalink / raw)
  To: caml-list

[-- Attachment #1: Type: text/plain, Size: 1630 bytes --]

Andrej Bauer <Andrej.Bauer@fmf.uni-lj.si> writes:
> Bünzli Daniel wrote:
>> let find map k = match Map.find map k with Some v -> v | None ->
>> assert false
>
> I have become to prefer option types as return values (as opposed to
> exceptions), but I admit it can be annoying to always consider both
> possibilities, especially if you know that "None" won't happen. If the
> library only provides "find" that returns an option type, the above
> solution gets around constant checking. But how much runtime overhead
> does it cause? Has anyone measured that?
>
> What is wrong with having two functions? With a bit of imagination, we
> can give them reasonable names, e.g., get and search. Everybody can
> guess which one returns the option type and which one throws an
> exception, right?

While `get' and `search' are probably OK (I presume that `get' raises
an exception, and `search' returns an option type), we must be
careful.  If multiple functions is the standard, I would prefer that a
naming/variant system be recommended (such as get and get_exn).  If we
come up with clever names for our various functions, I fear the Java
Queue API syndrome (where you can get a value with any of 4 different
functions, and add with another 4, that mostly differ in how they
handle error and thread blocking conditions and the names have little
correlation to the differences).

- Michael

-- 
mouse, n: A device for pointing at the xterm in which you want to type.
Confused by the strange files?  I cryptographically sign my messages.
For more information see <http://www.elehack.net/resources/gpg>.

[-- Attachment #2: Type: application/pgp-signature, Size: 188 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 14:16       ` Michael Ekstrand
@ 2008-01-31 19:28         ` David Teller
  2008-01-31 19:59           ` Michael Ekstrand
  2008-01-31 20:05           ` blue storm
  0 siblings, 2 replies; 36+ messages in thread
From: David Teller @ 2008-01-31 19:28 UTC (permalink / raw)
  To: Michael Ekstrand; +Cc: caml-list

Differentiating functions sounds like a good idea.

We may either:
* add a suffix after function names whenever they may raise exceptions
(suffix "_exn" sounds good to me)
* add a suffix after function names whenever they are variants that
don't raise exceptions (say, suffix "_maybe")
* write two different (sub)modules with the same set of functions, one
module being named Exception, the other one being named Option.

What else ? We could presumably functorize modules upon the definition
of a error-delivery mechanism, but that might be overkill. 

Say
module type ErrorMechanism = sig
  type 't;                (**The type of a failure.*)
  type 'a can_fail; 
                          (**The type of a value that can either succeed
                             and produce a result of type 'a or fail and
                             produce an error of type t. *)
  value fail    : t -> 'a can_fail ; 
                          (**Fail. Depending on the mechanism, this may
                             either return some variant on option or
                             throw an exception.*)
 
  value succeed : 'a -> 'a can_fail ;
                          (**Succeed.*)
end;;

We could also introduce an exception monad which would be an
intermediate choice between using exceptions and using option types and
such. I have a just written a prototype for this, I'll try and release
it soon.

Cheers,
 David

On Thu, 2008-01-31 at 08:16 -0600, Michael Ekstrand wrote:
> While `get' and `search' are probably OK (I presume that `get' raises
> an exception, and `search' returns an option type), we must be
> careful.  If multiple functions is the standard, I would prefer that a
> naming/variant system be recommended (such as get and get_exn).  If we
> come up with clever names for our various functions, I fear the Java
> Queue API syndrome (where you can get a value with any of 4 different
> functions, and add with another 4, that mostly differ in how they
> handle error and thread blocking conditions and the names have little
> correlation to the differences).
> 
> - Michael

-- 
David Teller
 Security of Distributed Systems
  http://www.univ-orleans.fr/lifo/Members/David.Teller
 Angry researcher: French Universities need reforms, but the LRU act
brings liquidations. 


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 19:28         ` David Teller
@ 2008-01-31 19:59           ` Michael Ekstrand
  2008-01-31 20:05           ` blue storm
  1 sibling, 0 replies; 36+ messages in thread
From: Michael Ekstrand @ 2008-01-31 19:59 UTC (permalink / raw)
  To: David Teller; +Cc: caml-list

David Teller <David.Teller@univ-orleans.fr> writes:
> What else ? We could presumably functorize modules upon the definition
> of a error-delivery mechanism, but that might be overkill. 
>
> Say
> module type ErrorMechanism = sig
>   type 't;                (**The type of a failure.*)
>   type 'a can_fail; 
>                           (**The type of a value that can either succeed
>                              and produce a result of type 'a or fail and
>                              produce an error of type t. *)
>   value fail    : t -> 'a can_fail ; 
>                           (**Fail. Depending on the mechanism, this may
>                              either return some variant on option or
>                              throw an exception.*)
>  
>   value succeed : 'a -> 'a can_fail ;
>                           (**Succeed.*)
> end;;

This could have some interesting ramifications, such as aiding in the
construction of a condition/restart mechanism.

However, standard instantiations of these functorized modules should
probably be provided to make the common case (using the module with
one or the other standard behavior) easy.

- Michael

-- 
mouse, n: A device for pointing at the xterm in which you want to type.
Confused by the strange files?  I cryptographically sign my messages.
For more information see <http://www.elehack.net/resources/gpg>.


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 14:09     ` Andrej Bauer
  2008-01-31 14:16       ` Michael Ekstrand
@ 2008-01-31 20:03       ` Bünzli Daniel
  2008-01-31 20:25         ` David Teller
  2008-02-01  7:27         ` Michaël Grünewald
  1 sibling, 2 replies; 36+ messages in thread
From: Bünzli Daniel @ 2008-01-31 20:03 UTC (permalink / raw)
  To: Andrej.Bauer; +Cc: caml-list List


Le 31 janv. 08 à 15:09, Andrej Bauer a écrit :

> I have become to prefer option types as return values (as opposed to  
> exceptions), but I admit it can be annoying to always consider both  
> possibilities, especially if you know that "None" won't happen.

Maybe it is a point of view, you are fed up of considering both  
possibilites while I'm personally fed up of writing

match try Some (f x) with e -> None with
| None -> ..
| Some v -> ...

Because I need tail recursive functions.

> If the library only provides "find" that returns an option type, the  
> above solution gets around constant checking. But how much runtime  
> overhead does it cause? Has anyone measured that?

No idea. Unscientific benchmark at the end of the email.

> What is wrong with having two functions?

You have to choose. You don't have exceptionless error mangement  
anymore which is the point of the proposal. As the module developer I  
don't want to write two functions to do the same thing albeit in a  
slight different way one of which strikes me as the being the wrong way.

Best,

Daniel

osx 10.5.1 1ghz G4 512 ram

 > cat in.ml
let () =
   let f = ref [] in
   try while (true) do f := (input_line stdin) :: !f done
   with End_of_file -> ignore (!f)

 > cat inb.ml
let () =
   let rec next acc =
     match try Some (input_line stdin) with End_of_file -> None with
     | None -> acc
     | Some l -> next (l :: acc)
   in
   ignore (next [])

 > ocamlbuild in.native inb.native
Finished, 8 targets (0 cached) in 00:00:01.

 > time jot 1000000 | ./in.native

real	0m4.814s
user	0m4.371s
sys	0m0.218s

 > time jot 1000000 | ./inb.native

real	0m4.790s
user	0m4.355s
sys	0m0.217s

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 19:28         ` David Teller
  2008-01-31 19:59           ` Michael Ekstrand
@ 2008-01-31 20:05           ` blue storm
  1 sibling, 0 replies; 36+ messages in thread
From: blue storm @ 2008-01-31 20:05 UTC (permalink / raw)
  To: David Teller; +Cc: Michael Ekstrand, caml-list

My two cents :

- It's easy to derive variant-defined functions from the
exception-using ones, with virtually no performance cost. Going the
other way is not as practical, and i assume it has a higher runtime
overhead
- We will need to document our functions in any case : the exception
name generally doesn't provide an accurate enough description of the
causes of the error (be it an exception, a polymorphic variant, ...)
- The added safety is good, but not (in my eyes) essential for every
use; we could use tools, eg. OcamlExc (
http://caml.inria.fr/pub/old_caml_site/ocamlexc/ocamlexc.htm ) to
check the safety as well
- In most situation, exceptions allow for a more natural and more
concise code than options/variants/monads, precisely because they can
break flow of control (eg. in a "for" loop), and because our libs are
not quite adapted to that kind of programming now (where is mapM ?)

I would favor the conservative solution : still provide the exception
handling by default, and allowing an additional option/variants
version.

On 1/31/08, David Teller <David.Teller@univ-orleans.fr> wrote:
> Differentiating functions sounds like a good idea.
>
> We may either:
> * add a suffix after function names whenever they may raise exceptions
> (suffix "_exn" sounds good to me)
> * add a suffix after function names whenever they are variants that
> don't raise exceptions (say, suffix "_maybe")
> * write two different (sub)modules with the same set of functions, one
> module being named Exception, the other one being named Option.
>
> What else ? We could presumably functorize modules upon the definition
> of a error-delivery mechanism, but that might be overkill.
>
> Say
> module type ErrorMechanism = sig
>   type 't;                (**The type of a failure.*)
>   type 'a can_fail;
>                           (**The type of a value that can either succeed
>                              and produce a result of type 'a or fail and
>                              produce an error of type t. *)
>   value fail    : t -> 'a can_fail ;
>                           (**Fail. Depending on the mechanism, this may
>                              either return some variant on option or
>                              throw an exception.*)
>
>   value succeed : 'a -> 'a can_fail ;
>                           (**Succeed.*)
> end;;
>
> We could also introduce an exception monad which would be an
> intermediate choice between using exceptions and using option types and
> such. I have a just written a prototype for this, I'll try and release
> it soon.
>
> Cheers,
>  David
>
> On Thu, 2008-01-31 at 08:16 -0600, Michael Ekstrand wrote:
> > While `get' and `search' are probably OK (I presume that `get' raises
> > an exception, and `search' returns an option type), we must be
> > careful.  If multiple functions is the standard, I would prefer that a
> > naming/variant system be recommended (such as get and get_exn).  If we
> > come up with clever names for our various functions, I fear the Java
> > Queue API syndrome (where you can get a value with any of 4 different
> > functions, and add with another 4, that mostly differ in how they
> > handle error and thread blocking conditions and the names have little
> > correlation to the differences).
> >
> > - Michael
>
> --
> David Teller
>  Security of Distributed Systems
>   http://www.univ-orleans.fr/lifo/Members/David.Teller
>  Angry researcher: French Universities need reforms, but the LRU act
> brings liquidations.
>
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 20:03       ` Bünzli Daniel
@ 2008-01-31 20:25         ` David Teller
  2008-01-31 20:40           ` David Teller
                             ` (3 more replies)
  2008-02-01  7:27         ` Michaël Grünewald
  1 sibling, 4 replies; 36+ messages in thread
From: David Teller @ 2008-01-31 20:25 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: Andrej.Bauer, caml-list List


On Thu, 2008-01-31 at 21:03 +0100, Bünzli Daniel wrote:
> Le 31 janv. 08 à 15:09, Andrej Bauer a écrit :
> 
> > I have become to prefer option types as return values (as opposed to  
> > exceptions), but I admit it can be annoying to always consider both  
> > possibilities, especially if you know that "None" won't happen.
> 
> Maybe it is a point of view, you are fed up of considering both  
> possibilites while I'm personally fed up of writing
> 
> match try Some (f x) with e -> None with
> | None -> ..
> | Some v -> ...
> 
> Because I need tail recursive functions.

What about a generic 

type result 'r 'e =
    | Success of 'r  (**The operation was a success*)
    | Failure of 'e  (**The operation was a failure*) 

let purify e = 
    try 
      Success ( Lazy.force e )
    with 
      exc -> Failure exc

?

With one such mechanism we can nearly automatically transform
exception-returning expressions into exceptionless management. We could
complete this with a trivial amount of Camlp4 code to avoid the call to
"lazy / Lazy.force".

What do you think about this solution ?

Cheers,
 David

-- 
David Teller
 Security of Distributed Systems
  http://www.univ-orleans.fr/lifo/Members/David.Teller
 Angry researcher: French Universities need reforms, but the LRU act
brings liquidations. 


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 20:25         ` David Teller
@ 2008-01-31 20:40           ` David Teller
  2008-01-31 21:16           ` Bünzli Daniel
                             ` (2 subsequent siblings)
  3 siblings, 0 replies; 36+ messages in thread
From: David Teller @ 2008-01-31 20:40 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List, Andrej.Bauer

On Thu, 2008-01-31 at 21:25 +0100, David Teller wrote:
> What about a generic 
> 
> type result 'r 'e =
>     | Success of 'r  (**The operation was a success*)
>     | Failure of 'e  (**The operation was a failure*) 
> 
> let purify e = 
>     try 
>       Success ( Lazy.force e )
>     with 
>       exc -> Failure exc
> 
> ?

Oh, yeah, "Failure" was perhaps the wrong name to choose, as that's
already the name of an exception. So please replace occurrences of
"Failure" with "Failed" in the previous message.

And to answer a possibly incoming comment about 'e, yeah, it isn't
needed for exceptions, although I suspect it can come in handy for
operations that are exceptionless in the first place.

Cheers,
 David
-- 
David Teller
 Security of Distributed Systems
  http://www.univ-orleans.fr/lifo/Members/David.Teller
 Angry researcher: French Universities need reforms, but the LRU act
brings liquidations. 


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 20:25         ` David Teller
  2008-01-31 20:40           ` David Teller
@ 2008-01-31 21:16           ` Bünzli Daniel
  2008-01-31 21:31             ` David Teller
  2008-01-31 21:35           ` Jon Harrop
  2008-01-31 22:01           ` Christophe Raffalli
  3 siblings, 1 reply; 36+ messages in thread
From: Bünzli Daniel @ 2008-01-31 21:16 UTC (permalink / raw)
  To: caml-list List


Le 31 janv. 08 à 21:25, David Teller a écrit :

> What do you think about this solution ?

I have no love for camlp4 and I don't like too much infrastructure. As  
I already said I'm not really interested in having both.The  
recommendation as given has the advantage that it doesn't introduce  
any new type in the standard library or require external support. It  
is just a design guideline. Actually maybe this should have been  
called an ODG (ocaml design guideline) since as other have pointed out  
on the wiki there are extreme cases (like the Unix module) where you  
don't want exceptionless error management and I agree. Still, I think  
this recommendation is widely applicable and should be used for most  
(new) modules and I wanted to be able to put a name on it. However as  
always use your judgement too see if it really fits.

Best,

Daniel


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 21:16           ` Bünzli Daniel
@ 2008-01-31 21:31             ` David Teller
  0 siblings, 0 replies; 36+ messages in thread
From: David Teller @ 2008-01-31 21:31 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

On Thu, 2008-01-31 at 22:16 +0100, Bünzli Daniel wrote:
> Le 31 janv. 08 à 21:25, David Teller a écrit :
> 
> > What do you think about this solution ?
> 
> I have no love for camlp4 and I don't like too much infrastructure. 

Well, it's 5 lines of infrastructure, written once and for all, and
which does solve your source of irritation with try. So I can only
assume that it doesn't qualify as "too much infrastructure" :)

> The  
> recommendation as given has the advantage that it doesn't introduce  
> any new type in the standard library or require external support. 

Which recommendation is that, for the moment ?

Cheers,
 David

-- 
David Teller
 Security of Distributed Systems
  http://www.univ-orleans.fr/lifo/Members/David.Teller
 Angry researcher: French Universities need reforms, but the LRU act brings liquidations. 


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 20:25         ` David Teller
  2008-01-31 20:40           ` David Teller
  2008-01-31 21:16           ` Bünzli Daniel
@ 2008-01-31 21:35           ` Jon Harrop
  2008-01-31 22:01           ` Christophe Raffalli
  3 siblings, 0 replies; 36+ messages in thread
From: Jon Harrop @ 2008-01-31 21:35 UTC (permalink / raw)
  To: caml-list

On Thursday 31 January 2008 20:25:41 David Teller wrote:
> What about a generic
>
> type result 'r 'e =
>
>     | Success of 'r  (**The operation was a success*)
>     | Failure of 'e  (**The operation was a failure*)
>
> let purify e =
>     try
>       Success ( Lazy.force e )
>     with
>       exc -> Failure exc
>
> ?
>
> With one such mechanism we can nearly automatically transform
> exception-returning expressions into exceptionless management. We could
> complete this with a trivial amount of Camlp4 code to avoid the call to
> "lazy / Lazy.force".
>
> What do you think about this solution ?

Scrap the explicitly-declared sum type for a polymorphic variant, lazy value 
for a function and catch only a specific exception and you've got the 
approach that I already use.

You can factor this out but this is so rarely used that it isn't worth it. If 
the stdlib had common IO functions I wouldn't use that idiom at all.

-- 
Dr Jon D Harrop, Flying Frog Consultancy Ltd.
http://www.ffconsultancy.com/products/?e


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 20:25         ` David Teller
                             ` (2 preceding siblings ...)
  2008-01-31 21:35           ` Jon Harrop
@ 2008-01-31 22:01           ` Christophe Raffalli
  3 siblings, 0 replies; 36+ messages in thread
From: Christophe Raffalli @ 2008-01-31 22:01 UTC (permalink / raw)
  To: David Teller; +Cc: Bünzli Daniel, caml-list List, Andrej.Bauer


[-- Attachment #1.1: Type: text/plain, Size: 1098 bytes --]


>> match try Some (f x) with e -> None with
>> | None -> ..
>> | Some v -> ...
>>
>> Because I need tail recursive functions.
>>     
>
>   
For tail call and exception, the best is to keep exception and use "let 
try" contruct
(a camlp4 extension is available, but the coding is quite simple):

let try x =  expr  in
  normal_case
with
  e -> exc_case

is translated to

(try
   let x = expr in
   fun () -> normal_case
with
   e ->
     fun () -> exc_case) ()

This way you get tail call in norma_case and exc_case.

Hope this helps,
Christophe

-- 
Christophe Raffalli
Universite de Savoie
Batiment Le Chablais, bureau 21
73376 Le Bourget-du-Lac Cedex

tel: (33) 4 79 75 81 03
fax: (33) 4 79 75 87 42
mail: Christophe.Raffalli@univ-savoie.fr
www: http://www.lama.univ-savoie.fr/~RAFFALLI
---------------------------------------------
IMPORTANT: this mail is signed using PGP/MIME
At least Enigmail/Mozilla, mutt or evolution 
can check this signature. The public key is
stored on www.keyserver.net
---------------------------------------------


[-- Attachment #1.2: Christophe_Raffalli.vcf --]
[-- Type: text/x-vcard, Size: 310 bytes --]

begin:vcard
fn:Christophe Raffalli
n:Raffalli;Christophe
org:LAMA (UMR 5127)
email;internet:christophe.raffalli@univ-savoie.fr
title;quoted-printable:Ma=C3=AEtre de conf=C3=A9rences
tel;work:+33 4 79 75 81 03
note:http://www.lama.univ-savoie.fr/~raffalli
x-mozilla-html:TRUE
version:2.1
end:vcard


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31 20:03       ` Bünzli Daniel
  2008-01-31 20:25         ` David Teller
@ 2008-02-01  7:27         ` Michaël Grünewald
  2008-02-01  7:47           ` Bünzli Daniel
  1 sibling, 1 reply; 36+ messages in thread
From: Michaël Grünewald @ 2008-02-01  7:27 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: Andrej.Bauer, caml-list List

Bünzli Daniel <daniel.buenzli@erratique.ch> writes:

>> time jot 1000000 | ./in.native
>
> real	0m4.814s
> user	0m4.371s
> sys	0m0.218s

You are timing `jot' aren't you?

>> time jot 1000000 | ./inb.native
>
> real	0m4.790s
> user	0m4.355s
> sys	0m0.217s

The recommendation you proposed would be even more useful if it
emphasizes when ``Exceptionless error management'' is adequate. You
can rewrite last sentence of first paragraph

  ``The following points suggest that raising exceptions to signal
    unexceptional error cases is not a good idea.''

like this:

  ``Let's enumerate situations where raising exceptions to signal
    unexceptional error cases is not a good idea.''

Maybe would you also suppress the `bad' in the first sentence, since
it is `bad' with regard to the situations you are enumerating.
-- 
Michaël


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-01  7:27         ` Michaël Grünewald
@ 2008-02-01  7:47           ` Bünzli Daniel
  2008-02-01 10:50             ` Till Varoquaux
  0 siblings, 1 reply; 36+ messages in thread
From: Bünzli Daniel @ 2008-02-01  7:47 UTC (permalink / raw)
  To: caml-list List


Le 1 févr. 08 à 08:27, Michaël Grünewald a écrit :

> Bünzli Daniel <daniel.buenzli@erratique.ch> writes:
>
>>> time jot 1000000 | ./in.native
>>
>> real	0m4.814s
>> user	0m4.371s
>> sys	0m0.218s
>
> You are timing `jot' aren't you?

Not really, only half of the time. See at the end of this email.

> The recommendation you proposed would be even more useful if it
> emphasizes when ``Exceptionless error management'' is adequate.

Right. I'll try to do something along this line. I'll will highlight  
in the suggestions part (which is not part of the recommendation) that  
in Unix-like cases the recommendation should maybe not be followed.

Best,

Daniel


 > jot 1000000 > lines.txt

 > time ./in.native < lines.txt

real	0m6.093s
user	0m2.132s
sys	0m0.219s

 > time ./inb.native < lines.txt

real	0m6.827s
user	0m2.117s
sys	0m0.218s


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31  8:55 [OSR] Exceptionless error management Bünzli Daniel
  2008-01-31  9:57 ` [Caml-list] " Till Varoquaux
@ 2008-02-01  8:31 ` David Teller
  2008-02-01 12:19   ` Yaron Minsky
  2008-02-05 10:00 ` David Teller
  2008-02-11  8:12 ` David Teller
  3 siblings, 1 reply; 36+ messages in thread
From: David Teller @ 2008-02-01  8:31 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

	Hi list,

 If this is of any interest for the discussion, I have just finished
putting together a first prototype of fast exception monad. There's room
for at least one huge optimization, but the overall idea shouldn't
change. I've documented it somewhat here [1]. If there's interest, I
guess I could try and reimplement some core modules to make use of this
facility, as a manner of determining its usefulness. Or, rather, to add
a compatibility layer for some core modules.

Cheers,
 David

[1]
http://dutherenverseauborddelatable.wordpress.com/downloads/exception-monads-for-ocaml/ 

On Thu, 2008-01-31 at 09:55 +0100, Bünzli Daniel wrote:
> Hello,
> 
> Based on discussions and the resulting consensus that occured more  
> than once on this list. I wrote a recommendation on how modules should  
> perform error management. It is available here :
> 
> http://cocan.org/osr/exceptionless_error_management
> 
> Best,
> 
> Daniel

-- 
David Teller
 Security of Distributed Systems
  http://www.univ-orleans.fr/lifo/Members/David.Teller
 Angry researcher: French Universities need reforms, but the LRU act brings liquidations. 


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-01  7:47           ` Bünzli Daniel
@ 2008-02-01 10:50             ` Till Varoquaux
  2008-02-01 11:31               ` Bünzli Daniel
  0 siblings, 1 reply; 36+ messages in thread
From: Till Varoquaux @ 2008-02-01 10:50 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

I am still very ambivalent:

While I think having clearer signatures is great,  I am still wary
that this solution might prove too much of a constraint in some cases.
I still think exceptions shouldn't be shunned so quickly. As their
name clearly stipulates they should be used to handle exceptional
cases, and sometimes the nature of what's an exceptional case is
better left to the programmer's judgment (e.g. find). I believe that,
when needed, both functions should be exposed in the interface (e.g.
find and find_exn, or find and find_opt).

Exceptions are an amazing tool to handle exceptional cases because
they unwind stack the automatically.  This means that you don't have
to constantly thing about propagating the errors manually. A monad
can, of course, help with this, but there is a cost in code clarity to
consider. They can also help you identify the source of issues by
giving a back trace that is ultimately printed at the root of your
program (very hard to achieve without exceptions).

Choosing whether an error case should be treated as an exception is a
matter which, IMHO, does not have a general answer and depends on:
- How often the errors can occur and how they can be treated
- How safe you require your API to be. If you run with tight security
restrictions you will probably be more likely to take the
exception-less route. Note that taking a radical stance (like the one
advocated in your OSR) might make your programs a lot more verbose
and/or harder to grasp. Simplicity also leads to better security.
- Personal tastes.

I am also not very enthused by the use of the polymorphic variant
versus a Haskell like [Left | Right] variant. I think the former can
lead to hard to track errors (excerpt from the manual: "Beware also
that some idioms make trivial errors very hard to find.") bringing an
illusion of safety rather than safety itself. The latter also
separates in clearer way the error cases from the success cases.

Just my 0.02 (euro) cents.

Till

On Feb 1, 2008 7:47 AM, Bünzli Daniel <daniel.buenzli@erratique.ch> wrote:
>
> Le 1 févr. 08 à 08:27, Michaël Grünewald a écrit :
>
> > Bünzli Daniel <daniel.buenzli@erratique.ch> writes:
> >
> >>> time jot 1000000 | ./in.native
> >>
> >> real 0m4.814s
> >> user 0m4.371s
> >> sys  0m0.218s
> >
> > You are timing `jot' aren't you?
>
> Not really, only half of the time. See at the end of this email.
>
> > The recommendation you proposed would be even more useful if it
> > emphasizes when ``Exceptionless error management'' is adequate.
>
> Right. I'll try to do something along this line. I'll will highlight
> in the suggestions part (which is not part of the recommendation) that
> in Unix-like cases the recommendation should maybe not be followed.
>
> Best,
>
> Daniel
>
>
>  > jot 1000000 > lines.txt
>
>  > time ./in.native < lines.txt
>
> real    0m6.093s
> user    0m2.132s
> sys     0m0.219s
>
>  > time ./inb.native < lines.txt
>
> real    0m6.827s
> user    0m2.117s
> sys     0m0.218s
>
>
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>



-- 
http://till-varoquaux.blogspot.com/

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-01 10:50             ` Till Varoquaux
@ 2008-02-01 11:31               ` Bünzli Daniel
  2008-02-01 15:59                 ` Vincent Hanquez
  2008-02-01 16:04                 ` David Allsopp
  0 siblings, 2 replies; 36+ messages in thread
From: Bünzli Daniel @ 2008-02-01 11:31 UTC (permalink / raw)
  To: caml-list List


Le 1 févr. 08 à 11:50, Till Varoquaux a écrit :

> While I think having clearer signatures is great,  I am still wary
> that this solution might prove too much of a constraint in some cases.
> I still think exceptions shouldn't be shunned so quickly. As their
> name clearly stipulates they should be used to handle exceptional
> cases, and sometimes the nature of what's an exceptional case is
> better left to the programmer's judgment (e.g. find). I believe that,
> when needed, both functions should be exposed in the interface (e.g.
> find and find_exn, or find and find_opt).

I stand behind the one liner that will make the error implicit if you  
want. Explicit first, implicit if you want to take the risk.  
Personnally I wouldn't make it implicit unless it is for an "assert  
false", but this is a matter of philosophy.

> Exceptions are an amazing tool to handle exceptional cases because
> they unwind stack the automatically.  This means that you don't have
> to constantly thing about propagating the errors manually.

I have nothing against exceptions per se. I also use them in my own  
programs. But I don't want libraries to force me to use them. Recall  
that the recommendation says nothing about client code. You can  
perfectly define your own exceptions to propagate the error up.

> I am also not very enthused by the use of the polymorphic variant
> versus a Haskell like [Left | Right] variant. I think the former can
> lead to hard to track errors (excerpt from the manual: "Beware also
> that some idioms make trivial errors very hard to find.") bringing an
> illusion of safety rather than safety itself. The latter also
> separates in clearer way the error cases from the success cases.

On the safety bit I think this is less true if you actually take care  
to close your variants. However I tend to agree on the clearer  
separation of cases. I added a request for comments on this at the end  
of the OSR page to standardize on [ `Value of ... | `Error of ... ]  
instead of [ `Value of ... | .... ].

Best,

Daniel


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-01  8:31 ` David Teller
@ 2008-02-01 12:19   ` Yaron Minsky
  0 siblings, 0 replies; 36+ messages in thread
From: Yaron Minsky @ 2008-02-01 12:19 UTC (permalink / raw)
  To: David Teller; +Cc: Bünzli Daniel, caml-list List

[-- Attachment #1: Type: text/plain, Size: 1465 bytes --]

We've come to be pretty leery of exceptions at Jane Street, and we've had
some experience trying to control their use  Some quick observations on the
current proposal:

   1. Banning exceptions outright seems too strict.  Our tendency has
   been to have two versions of the function, e.g., Map.find and
   Map.find_exn.  (Our previous approach would have been to use
   Map.find_opt for the one that returns and option and Map.find for the
   exception-throwing one, but we're slowly migrating to the first proposal.)
   The goal is to make the user aware that an exception is reasonably likely,
   rather than ban exceptions.
   2. We've played around with monadic error systems that combine errors
   into a big polymorphic variant.  The key practical problem we hit were
   obscenely complicated error messages.  Still, in some cases, monads are very
   nice.
   3. Having a variant type other than option so you can specify various
   different errors (ours is Ok of 'a | Error of 'b) is a good idea.  And I
   think it's common enough that you should define it in your core library as
   an ordinary variant and make it available everywhere.

y


>
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>

[-- Attachment #2: Type: text/html, Size: 2073 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-01 11:31               ` Bünzli Daniel
@ 2008-02-01 15:59                 ` Vincent Hanquez
  2008-02-01 18:37                   ` Bünzli Daniel
  2008-02-01 16:04                 ` David Allsopp
  1 sibling, 1 reply; 36+ messages in thread
From: Vincent Hanquez @ 2008-02-01 15:59 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

On Fri, Feb 01, 2008 at 12:31:52PM +0100, Bünzli Daniel wrote:
> On the safety bit I think this is less true if you actually take care to 
> close your variants. However I tend to agree on the clearer separation of 
> cases. I added a request for comments on this at the end of the OSR page to 
> standardize on [ `Value of ... | `Error of ... ] instead of [ `Value of ... 
> | .... ].

but what's wrong with the plain [ Value of ... | Error of ... ] variant
instead of polymorphic variant ?

-- 
Vincent Hanquez


^ permalink raw reply	[flat|nested] 36+ messages in thread

* RE: [Caml-list] [OSR] Exceptionless error management
  2008-02-01 11:31               ` Bünzli Daniel
  2008-02-01 15:59                 ` Vincent Hanquez
@ 2008-02-01 16:04                 ` David Allsopp
  1 sibling, 0 replies; 36+ messages in thread
From: David Allsopp @ 2008-02-01 16:04 UTC (permalink / raw)
  To: 'caml-list List'

> > While I think having clearer signatures is great,  I am still wary
> > that this solution might prove too much of a constraint in some cases.
> > I still think exceptions shouldn't be shunned so quickly. As their
> > name clearly stipulates they should be used to handle exceptional
> > cases, and sometimes the nature of what's an exceptional case is
> > better left to the programmer's judgment (e.g. find). I believe that,
> > when needed, both functions should be exposed in the interface (e.g.
> > find and find_exn, or find and find_opt).
>
> I stand behind the one liner that will make the error implicit if you  
> want. Explicit first, implicit if you want to take the risk.  
> Personnally I wouldn't make it implicit unless it is for an "assert  
> false", but this is a matter of philosophy.

Making the error explicit (i.e. using match) forces a decision on the client
of a library - and that breaks the golden rule of library design because
it's none of your business (as a library author) to force any decision on
the end-user of your library that is not necessary to maintain correct
operation of your library.

> > Exceptions are an amazing tool to handle exceptional cases because
> > they unwind stack the automatically.  This means that you don't have
> > to constantly thing about propagating the errors manually.
>
> I have nothing against exceptions per se. I also use them in my own  
> programs. But I don't want libraries to force me to use them. Recall  
> that the recommendation says nothing about client code. You can  
> perfectly define your own exceptions to propagate the error up.

But your proposal forces me to *use* 'a option when I want to *ignore*
exceptions. If I've got a map and, by proof, I know that I'll never do a
find on it that would raise Not_found then I sure don't want to wrap every
Map.find with either Option.get or a match clause.

I heartily approve of the notion of exceptions for exceptional cases as a
rule of thumb[*] - for example, many of the exceptions used in the Unix
module "should" definitely be 'a option (you should never perform I/O
without error checking, so 'a option - or, as I would use, ('a, 'b) result
is appropriate).

Furthermore, in the case of functions such as Map.find, the library author
*cannot* know whether failure to find an item in the map is exceptional or
not - and for that reason you cannot mandate 'a option as a return value -
the only real solution is to provide both functions and allow the client to
decide whether failure to find an item is exception or, failing that,
provide the path with the easiest wrapping - and I'm afraid that's
unarguably the exception route.

Incidentally, there's no need to benchmark to discover whether 'a option
wrapping is slower - it must be because it involves an extra allocation over
using exceptions. However, this difference is probably not that great (and
there are more possible compiler optimisations - though not necessarily
exploited by OCaml - that become possible if you don't use exceptions).


David


[*] Although IMHO "exceptions for exceptional circumstances" is a bit of a
beginners' mantra. Exceptions should be used in situations where you need to
unwind the stack - exceptional circumstances are one instance of this.
Another, equally valid, use of exceptions is in search algorithms - you may
be several stack levels down before discovering that a certain branch
decision was incorrect and using exception programming to unwind this is
much neater than passing values around.


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-01 15:59                 ` Vincent Hanquez
@ 2008-02-01 18:37                   ` Bünzli Daniel
  2008-02-01 19:43                     ` Vincent Hanquez
  0 siblings, 1 reply; 36+ messages in thread
From: Bünzli Daniel @ 2008-02-01 18:37 UTC (permalink / raw)
  To: Vincent Hanquez; +Cc: caml-list List


Le 1 févr. 08 à 16:59, Vincent Hanquez a écrit :

> but what's wrong with the plain [ Value of ... | Error of ... ]  
> variant
> instead of polymorphic variant ?

If it is not defined in Pervasives you have to redefine in it every  
module that follows the recommendation and prefix with module names on  
matching. Annoying.

Now if you know how to get something new accepted in Pervasives I have  
no problem with a plain variant type.

Best,

Daniel


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-01 18:37                   ` Bünzli Daniel
@ 2008-02-01 19:43                     ` Vincent Hanquez
  0 siblings, 0 replies; 36+ messages in thread
From: Vincent Hanquez @ 2008-02-01 19:43 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

On Fri, Feb 01, 2008 at 07:37:45PM +0100, Bünzli Daniel wrote:
> If it is not defined in Pervasives you have to redefine in it every module 
> that follows the recommendation and prefix with module names on matching. 
> Annoying.

Yes, that's annoying. but polymorphic variant got their own annoyance as well.

> Now if you know how to get something new accepted in Pervasives I have no 
> problem with a plain variant type.

last time i checked, Pervasives is LGPL+static exception.
we can add anything we need in Pervasives.

-- 
Vincent Hanquez


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31  8:55 [OSR] Exceptionless error management Bünzli Daniel
  2008-01-31  9:57 ` [Caml-list] " Till Varoquaux
  2008-02-01  8:31 ` David Teller
@ 2008-02-05 10:00 ` David Teller
  2008-02-05 10:12   ` Vincent Hanquez
  2008-02-11  8:12 ` David Teller
  3 siblings, 1 reply; 36+ messages in thread
From: David Teller @ 2008-02-05 10:00 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

    Ok everyone,

 The debate on this subject seems to have calmed down. A tentative set
of recommendations have been put together on the wiki [1] by some of the
participants. It looks coherent and well-written. If nothing springs
back to the front of the scene within a few days, I'll post this again
to the mailing-list as a call for votes.

Cheers,
 David

[1]  http://cocan.org/osr/exceptionless_error_management




On Thu, 2008-01-31 at 09:55 +0100, Bünzli Daniel wrote:
> Hello,
> 
> Based on discussions and the resulting consensus that occured more  
> than once on this list. I wrote a recommendation on how modules should  
> perform error management. It is available here :
> 
> http://cocan.org/osr/exceptionless_error_management
> 
> Best,
> 
> Daniel
> 
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
> 
-- 
David Teller
 Security of Distributed Systems
  http://www.univ-orleans.fr/lifo/Members/David.Teller
 Angry researcher: French Universities need reforms, but the LRU act brings liquidations. 


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-05 10:00 ` David Teller
@ 2008-02-05 10:12   ` Vincent Hanquez
  2008-02-05 10:26     ` Bünzli Daniel
  2008-02-05 14:12     ` David Teller
  0 siblings, 2 replies; 36+ messages in thread
From: Vincent Hanquez @ 2008-02-05 10:12 UTC (permalink / raw)
  To: David Teller; +Cc: Bünzli Daniel, caml-list List

On Tue, Feb 05, 2008 at 11:00:44AM +0100, David Teller wrote:
>  The debate on this subject seems to have calmed down. A tentative set
> of recommendations have been put together on the wiki [1] by some of the
> participants. It looks coherent and well-written. If nothing springs
> back to the front of the scene within a few days, I'll post this again
> to the mailing-list as a call for votes.

looking at the page, I find a proposal (beginning), and a lots of people
disaggreeing at the end.

I can see lots of people are concerned by using polymorphic variant (and
I certainly agree with those), and people asking for a monadic approch
(haskell's either like). I can see anything change in the proposal
regarding people's concerned, so what are you going to call for a vote ?

-- 
Vincent Hanquez


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-05 10:12   ` Vincent Hanquez
@ 2008-02-05 10:26     ` Bünzli Daniel
  2008-02-05 11:06       ` Vincent Hanquez
                         ` (2 more replies)
  2008-02-05 14:12     ` David Teller
  1 sibling, 3 replies; 36+ messages in thread
From: Bünzli Daniel @ 2008-02-05 10:26 UTC (permalink / raw)
  To: caml-list List


Le 5 févr. 08 à 11:12, Vincent Hanquez a écrit :

> looking at the page, I find a proposal (beginning), and a lots of  
> people
> disaggreeing at the end.

I agree with this I think it should be moved to a "rejected proposals"  
section. When I find some time I will add a preamble explaining why it  
was rejected.

> I can see lots of people are concerned by using polymorphic variant  
> (and
> I certainly agree with those), and people asking for a monadic approch
> (haskell's either like).

Still I think this is a little bit sad. Using polymorphic variants  
isn't that bad at all as long as we just use the following _closed_  
type [ `Value of  ... | `Error of ... ]. This would allow us to move  
forward despite that fact that Pervasives is frozen (and no I'm not  
interested in forking it). Sure we can have monadic stuff, new types,  
new infrastructure etc. but I try to design solely within the  
constraint of the ocaml system as it stands because I know that's  
something has been there for more than 10 years and continues to be  
maintained. Polymorphic variants have the advantage to allow us to  
standardize across modules without needing changes to the ocaml system.

Best,

Daniel

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-05 10:26     ` Bünzli Daniel
@ 2008-02-05 11:06       ` Vincent Hanquez
  2008-02-05 13:46         ` Jon Harrop
  2008-02-05 11:36       ` Frédéric van der Plancke
  2008-02-06  8:45       ` Michaël Grünewald
  2 siblings, 1 reply; 36+ messages in thread
From: Vincent Hanquez @ 2008-02-05 11:06 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

On Tue, Feb 05, 2008 at 11:26:00AM +0100, Bünzli Daniel wrote:
>> I can see lots of people are concerned by using polymorphic variant (and
>> I certainly agree with those), and people asking for a monadic approch
>> (haskell's either like).
>
> Still I think this is a little bit sad. Using polymorphic variants isn't 
> that bad at all as long as we just use the following _closed_ type [ `Value 
> of  ... | `Error of ... ].

imho, polymorphic variants ""weaken"" the type system and are a royal PITA
when something is wrong in the code and you need to find it.

for example something plain _stupid_ as:
returning or matching `VAlue instead of `Value

since it will be created "dynamicly" (you don't need to define it), ocaml
will be perfectly happy to return/match it, but you'll have a "weird" error
somewhere else:

# let f x : [`Error | `Value of int ] = if x <= 0 then `Error else `Value x;;
val f : int -> [ `Error | `Value of int ] = <fun>

# let g y = match f y with `Error -> "error" | `VAlue x -> "value"

This pattern matches values of type [< `Error ]
but is here used to match values of type [ `Error | `Value of int ]
The first variant type does not allow tag(s) `Value

with normal variant i'll have a nice error:

	Unbound constructor VAlue

And that's just one thing on the list of 'against' polymorphic variants;
i'm sure people have their own set of bad experiences with polymorphic
variants.

> This would allow us to move forward despite that 
> fact that Pervasives is frozen (and no I'm not interested in forking it). 

This is not "forking", for me that's patching.
We _can_ provide the same interface+improvements (no breaking of
previous programs) easily _without_ forking with minimal intrusion as a
patchqueue on top of ocaml stdlib. the compiler might be forbidden
fruit (license, INRIA expertise, etc) and that's probably a bad idea to
fork it anyway, but stdlib should be where we could add major improvement
to the language (a rich and nice stdlib just like all other languages).

Also a proposal that define exceptionless without having the core
library like Hashtbl, Map, Set, List, conforms to this "standard" is
just bound to failure. Either they are modified (bad idea for
compability), Copied+forked into another module (nobody going to use it
+ you're forking some of the stdlib) or the proposal is moot.

> Sure we can have monadic stuff, new types, new infrastructure etc. but I 
> try to design solely within the constraint of the ocaml system as it stands 
> because I know that's something has been there for more than 10 years and 
> continues to be maintained.
> Polymorphic variants have the advantage to 
> allow us to standardize across modules without needing changes to the ocaml 
> system.

they might be standard in ocaml (as in available through the compiler),
but not much library use them.

people should have that in mind when trying to propose them as an OSR;
lots of people are not confortable with them imo.

-- 
Vincent Hanquez


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-05 10:26     ` Bünzli Daniel
  2008-02-05 11:06       ` Vincent Hanquez
@ 2008-02-05 11:36       ` Frédéric van der Plancke
  2008-02-06  8:45       ` Michaël Grünewald
  2 siblings, 0 replies; 36+ messages in thread
From: Frédéric van der Plancke @ 2008-02-05 11:36 UTC (permalink / raw)
  To: caml-list

Bünzli Daniel wrote:
> Still I think this is a little bit sad. Using polymorphic variants 
> isn't that bad at all as long as we just use the following _closed_ 
> type [ `Value of  ... | `Error of ... ]. This would allow us to move 
> forward despite that fact that Pervasives is frozen (and no I'm not 
> interested in forking it).
But Pervasives is not *that* frozen. If I understand things well, the 
main concern of Inria is having to maintain the would-be additions and 
changes to Pervasives. An Ok | Error variant doesn't look like it will 
entail heavy maintenance charges. So they may accept to add it.

(I don't think there are backwards-compatibility problems either as 
user-defined Ok|Error would hide a Pervasives-defined one in all 
contexts I can think of.)

Frédéric


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-05 11:06       ` Vincent Hanquez
@ 2008-02-05 13:46         ` Jon Harrop
  0 siblings, 0 replies; 36+ messages in thread
From: Jon Harrop @ 2008-02-05 13:46 UTC (permalink / raw)
  To: caml-list; +Cc: Vincent Hanquez, Bünzli Daniel, caml-list List

On Tuesday 05 February 2008 11:06:41 Vincent Hanquez wrote:
> This is not "forking", for me that's patching.
> We _can_ provide the same interface+improvements (no breaking of
> previous programs) easily _without_ forking with minimal intrusion as a
> patchqueue on top of ocaml stdlib. the compiler might be forbidden
> fruit (license, INRIA expertise, etc) and that's probably a bad idea to
> fork it anyway, but stdlib should be where we could add major improvement
> to the language (a rich and nice stdlib just like all other languages).
>
> Also a proposal that define exceptionless without having the core
> library like Hashtbl, Map, Set, List, conforms to this "standard" is
> just bound to failure. Either they are modified (bad idea for
> compability), Copied+forked into another module (nobody going to use it
> + you're forking some of the stdlib) or the proposal is moot.

Exactly. Whatever everyone wants to call it, the stdlib desperately needs 
improving and tacking on more third party libraries (ExtLib, AnnexLib, 
PagodaCore, Baird, ...) is not the way to do it.

I personally want to see lots of simple, minimal improvements to the stdlib 
but I'm afraid that lots of other people are going to want to push their 
untested Obj-riddled codebases into any improvement, which scares me.

> > Sure we can have monadic stuff, new types, new infrastructure etc. but I
> > try to design solely within the constraint of the ocaml system as it
> > stands because I know that's something has been there for more than 10
> > years and continues to be maintained.
> > Polymorphic variants have the advantage to
> > allow us to standardize across modules without needing changes to the
> > ocaml system.
>
> they might be standard in ocaml (as in available through the compiler),
> but not much library use them.

Jacques Garrigue's libraries (e.g. LablGL) do and they work very well.

This is one area where OCaml is much nicer than F# (inherited from .NET). For 
example, in F# you write CullFace.Both or ControlStyles.DoubleBuffer but in 
OCaml you just write `Both or `DoubleBuffer.

> people should have that in mind when trying to propose them as an OSR;
> lots of people are not confortable with them imo.

I would recommend avoiding recursive polymorphic types in library APIs but I 
have no problems with small, simple, non-recursive definitions like [ `Value 
of 'a | `Exception of 'b ].

-- 
Dr Jon D Harrop, Flying Frog Consultancy Ltd.
http://www.ffconsultancy.com/products/?e


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-05 10:12   ` Vincent Hanquez
  2008-02-05 10:26     ` Bünzli Daniel
@ 2008-02-05 14:12     ` David Teller
  1 sibling, 0 replies; 36+ messages in thread
From: David Teller @ 2008-02-05 14:12 UTC (permalink / raw)
  To: Vincent Hanquez; +Cc: Bünzli Daniel, caml-list List

On Tue, 2008-02-05 at 11:12 +0100, Vincent Hanquez wrote:
> On Tue, Feb 05, 2008 at 11:00:44AM +0100, David Teller wrote:
> >  The debate on this subject seems to have calmed down. A tentative set
> > of recommendations have been put together on the wiki [1] by some of the
> > participants. It looks coherent and well-written. If nothing springs
> > back to the front of the scene within a few days, I'll post this again
> > to the mailing-list as a call for votes.
> 
> looking at the page, I find a proposal (beginning), and a lots of people
> disaggreeing at the end.
> 
> I can see lots of people are concerned by using polymorphic variant (and
> I certainly agree with those), and people asking for a monadic approch
> (haskell's either like). I can see anything change in the proposal
> regarding people's concerned, so what are you going to call for a vote ?

Ok, my bad, I guess I misunderstood silence for consensus.

In this case, let me try and sum up the discussion. I'll use the term
"exception" for OCaml's built-in exception system.

1) This recommendation applies to functional libraries, by opposition to
essentially imperative libraries such as Unix.
[ I believe everybody agrees with that ]

2) This recommendation only applies to the interface of libraries,
rather than their non-observable implementation or their use by clients.
[ I believe everybody agrees with that ]

3) Exceptions passing library barriers should be reserved for programmer
errors (i.e. invalid arguments and impossible-to-reach states) rather
than previsible errors (e.g. sometimes, a key does not map to a value).
We already have standard names for such exceptions.
[ I have the impression nobody disagrees with that, either ]

4) At hand, to provide non-exception error management, we have the
following tools:
* 'a option 
* something such as ('a, 'b) either  -- exact name and constructors
remain to be decided, but the general idea is there -- which may serve,
if necessary, as the base for error monads
* polymorphic variants
* an implementation of error monad based on exceptions, which may be
trivially degraded to   ('a, 'b) either   whenever necessary.

(I'm discounting my own suggestion for functor-based error reporting as
I haven't had time to work on that, plus it would actually solve a
different problem)

[ Unless I'm mistaken, these are the only tools suggested so far ]

5) We may need to differentiate functions which raise exceptions.
Someone on this thread suggested adding suffix "_exn" to the name of
such functions. Another possibility would be to define a type such as
  type 'a raising = 'a
to document the fact that a function may raise an exception.

[ No discussion on this yet ]


6) Assuming that no other tools come into the discussion, we need to
determine which tools are best for which situation.

There seems to be an agreement that polymorphic variant are too fragile
for general use. This leaves us essentially 
* ('a,'b) either  (of which 'a option is just a special case)
* the exception-based error monad, with the ability to produce results
of type 'a or errors of type 'b . 

These cases are fundamentally equivalent, each may be used to build the
other and result in essentially the same type signature.

[ No discussion on this yet ]


7) Assuming that we use one of these two possibilities, we need to
decide what to put in the 'b. 

Here, we may decide to:
* either define module-specific types ; 
* or use polymorphic variants.

Again, the general consensus seems to be that polymorphic variants are
too risky. On the other hand, we may also decide not to specify at all
what to put in 'b and to let each developer decide for their own
library.

[ No discussion on this yet ]




As a test, I've adapted the interface of the List module.
* I've included the interface for both possibilities
* I've postfixing exception-raising functions with "_exn"
* I've defined module-specific sum types, some of which could presumably
be moved to Pervasives.

You may find the result here:
http://www.univ-orleans.fr/lifo/Members/David.Teller/software/exceptions/list_with_errors.mli 

Cheers,
 David

-- 
David Teller
 Security of Distributed Systems
  http://www.univ-orleans.fr/lifo/Members/David.Teller
 Angry researcher: French Universities need reforms, but the LRU act brings liquidations. 


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-05 10:26     ` Bünzli Daniel
  2008-02-05 11:06       ` Vincent Hanquez
  2008-02-05 11:36       ` Frédéric van der Plancke
@ 2008-02-06  8:45       ` Michaël Grünewald
  2008-02-08 13:09         ` Bünzli Daniel
  2 siblings, 1 reply; 36+ messages in thread
From: Michaël Grünewald @ 2008-02-06  8:45 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

Bünzli Daniel <daniel.buenzli@erratique.ch> writes:

> Le 5 févr. 08 à 11:12, Vincent Hanquez a écrit :
>
>> looking at the page, I find a proposal (beginning), and a lots of
>> people
>> disaggreeing at the end.
>
> I agree with this I think it should be moved to a "rejected proposals"
> section. When I find some time I will add a preamble explaining why it
> was rejected.

Although it did not meet a consensus, the proposal might still be
useful. Developpers should be able to claim at the beginning of a file
or in their projet's documentation:

 ``We adhere to conventions described in PAPER, regarding
   exceptionless error reporting.''

The benefit from doing so, is that it helps having coherent code
(users can report that parts of the code break proposal, etc.).

So ``rejected proposals'' sounds a bit pessimistic to me, we could
have four sections (or even more):
 1. proposals (for discussion);
 2. recommendations (proposals that met a large success);
 3. options (proposals that did not met a large success, or are not
      intended for large audience, but are still a useful reference
      because they are adhered to in some code);
 4. attic (proposals that do not fit in the first three, maybe because
    they have been rejected).

(The vote mechanism should then only apply to publications in 2.)

By the way the title of your proposal is informative about the problem
you are giving a possible answer, but it do not give a word about the
solution. I think it should, beacuse discussion on the page show that
there exist(?) other strategies than the one you describe.
-- 
All the best,
Michaël


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-06  8:45       ` Michaël Grünewald
@ 2008-02-08 13:09         ` Bünzli Daniel
  0 siblings, 0 replies; 36+ messages in thread
From: Bünzli Daniel @ 2008-02-08 13:09 UTC (permalink / raw)
  To: caml-list List

Le 6 févr. 08 à 09:45, Michaël Grünewald a écrit :

> Although it did not meet a consensus, the proposal might still be
> useful. Developpers should be able to claim at the beginning of a file
> or in their projet's documentation:
>
> ``We adhere to conventions described in PAPER, regarding
>   exceptionless error reporting.''

Yes. As I said earlier, I see this recommendation more as a design  
pattern than a recommendation.

Since people still want to use exceptions in some cases, I narrowed  
the scope of the recommendation from modules to functional values.

Best,

Daniel


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-01-31  8:55 [OSR] Exceptionless error management Bünzli Daniel
                   ` (2 preceding siblings ...)
  2008-02-05 10:00 ` David Teller
@ 2008-02-11  8:12 ` David Teller
  2008-02-11  9:09   ` Bünzli Daniel
  3 siblings, 1 reply; 36+ messages in thread
From: David Teller @ 2008-02-11  8:12 UTC (permalink / raw)
  To: Bünzli Daniel; +Cc: caml-list List

I've re-read the candidate and I have one suggestion: at the moment, you
want to standardize both `Success and `Error and use `Error to carry
further results. Why not trim-down slightly this recommandation and
standardize only `Success (or the more concise `Ok, as suggested by
Yaron) ?

This would let us have

val find: ('a -> bool) -> 'a list -> [`Ok of 'a | `Not_found]
val open_file : string -> [`Ok of file_handler | `No_such_file |
`No_authorization]

etc.

I believe this would make code more readable.

Cheers,
 David

On Thu, 2008-01-31 at 09:55 +0100, Bünzli Daniel wrote:
> Hello,
> 
> Based on discussions and the resulting consensus that occured more  
> than once on this list. I wrote a recommendation on how modules should  
> perform error management. It is available here :
> 
> http://cocan.org/osr/exceptionless_error_management
> 
> Best,
> 
> Daniel
> 
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
> 
-- 
David Teller
 Security of Distributed Systems
  http://www.univ-orleans.fr/lifo/Members/David.Teller
 Angry researcher: French Universities need reforms, but the LRU act brings liquidations. 


^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Caml-list] [OSR] Exceptionless error management
  2008-02-11  8:12 ` David Teller
@ 2008-02-11  9:09   ` Bünzli Daniel
  0 siblings, 0 replies; 36+ messages in thread
From: Bünzli Daniel @ 2008-02-11  9:09 UTC (permalink / raw)
  To: David Teller; +Cc: caml-list List


Le 11 févr. 08 à 09:12, David Teller a écrit :

> I've re-read the candidate and I have one suggestion: at the moment,  
> you
> want to standardize both `Success and `Error and use `Error to carry
> further results. Why not trim-down slightly this recommandation and
> standardize only `Success (or the more concise `Ok, as suggested by
> Yaron) ?

Actually the initial version did exactly this. I changed it because  
some commented that they wanted a clear case for the error. But if  
most agree with you I'm willing to change it back.

Best,

Daniel

^ permalink raw reply	[flat|nested] 36+ messages in thread

end of thread, other threads:[~2008-02-11  9:09 UTC | newest]

Thread overview: 36+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-01-31  8:55 [OSR] Exceptionless error management Bünzli Daniel
2008-01-31  9:57 ` [Caml-list] " Till Varoquaux
2008-01-31 11:01   ` Bünzli Daniel
2008-01-31 14:09     ` Andrej Bauer
2008-01-31 14:16       ` Michael Ekstrand
2008-01-31 19:28         ` David Teller
2008-01-31 19:59           ` Michael Ekstrand
2008-01-31 20:05           ` blue storm
2008-01-31 20:03       ` Bünzli Daniel
2008-01-31 20:25         ` David Teller
2008-01-31 20:40           ` David Teller
2008-01-31 21:16           ` Bünzli Daniel
2008-01-31 21:31             ` David Teller
2008-01-31 21:35           ` Jon Harrop
2008-01-31 22:01           ` Christophe Raffalli
2008-02-01  7:27         ` Michaël Grünewald
2008-02-01  7:47           ` Bünzli Daniel
2008-02-01 10:50             ` Till Varoquaux
2008-02-01 11:31               ` Bünzli Daniel
2008-02-01 15:59                 ` Vincent Hanquez
2008-02-01 18:37                   ` Bünzli Daniel
2008-02-01 19:43                     ` Vincent Hanquez
2008-02-01 16:04                 ` David Allsopp
2008-02-01  8:31 ` David Teller
2008-02-01 12:19   ` Yaron Minsky
2008-02-05 10:00 ` David Teller
2008-02-05 10:12   ` Vincent Hanquez
2008-02-05 10:26     ` Bünzli Daniel
2008-02-05 11:06       ` Vincent Hanquez
2008-02-05 13:46         ` Jon Harrop
2008-02-05 11:36       ` Frédéric van der Plancke
2008-02-06  8:45       ` Michaël Grünewald
2008-02-08 13:09         ` Bünzli Daniel
2008-02-05 14:12     ` David Teller
2008-02-11  8:12 ` David Teller
2008-02-11  9:09   ` Bünzli Daniel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).