Richard Jones <r...@annexia.org> writes: > On Wed, May 26, 2010 at 06:15:05PM +0200, Hans Ole Rafaelsen wrote: >> What experience does people have to using alternatives to exceptions, such >> as option types or exception monads? Does use of third part libraries that >> still throws exceptions make such approaches hard to use? Performance wise >> it seems to be comparable to catching exceptions or matching for options, so >> I guess the difference be might a question of programming style? > > Personally I've found that you should only throw those exceptions > which can be caught in a single place in the program. By this I mean > that an exception such as Not_found shouldn't be thrown, and instead > it would be better to use an option type (for stdlib functions which > throw Not_found, you have to be _very_ careful that the exception > cannot "escape").
Which needlessly complicates your code when it never happens. Imho a good module should provide both an exception and option based interface to fit the circumstances and programming style. > However if the exception is, say, an I/O error reading a disk file, > these should be thrown, and caught somewhere central where you can > display an error message to the user (for GUI programs) or abort the > current transaction (for server programs). Recovering from such > exceptions properly is still tricky though. Since OCaml lacks > 'finally', you either have to use a 'finally' impl from a library, or > modify your code to not need it (eg. turning calls to 'open_in' and > 'open_out' into a kind of continuation-passing style). Or for small > programs, abort the program and don't deal with recovery at all. > > All in all, this is not ideal for writing correct programs. Some sort > of exception analysis would be most welcome. It would be nice if the possible exceptions of a function would be part of the type. E.g. let f1 () = raise Not_found val f1 : unit -> 'a [ Not_found ] let f2 () = try f1 () with Not_found -> () val f2 : unit -> unit let f3 f = try f () with Not_found -> () val f3: (unit -> 'a [< Not_found | 'B ]) -> 'a [ 'B ] and so on. Someone would have to write a new type system for that though. MfG Goswin _______________________________________________ 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