[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [MirageOS-devel] Error handling in Mirage - request for comments!
Hi all, As this discussion keeps on running, I thought I would add a couple of thoughts: - The problem with using exceptions for returning errors is that it becomes very difficult to distinguish between a dynamic error that is part of normal use (e.g. this network connection failed) from a programming error (e.g. Not_found accidently leaked from a use of List.find, an assert false triggering). This makes it hard to produce the correct behaviour in all cases: there are applications for which it would be better to kill everyting on detecting a programmer error rather than risk continuing in an unstable state. - The problem with using Lwt.t as your error monad is that it becomes difficult to distiunguish between synchronous things that may return errors, asynchronous things that may return errors, and asynchornous things that should not return errors. It also seems tied up with the exception mechanism, which leads to the same problem as my previous point. Personally, I would probably suggest that all Mirage modules/module types include in their signatures: type error val pp_error : formatter -> error -> string For cases where an error can reasonably be matched on and handled specially, this should be exposed in the signature: type error = private [> `Foo of foo | `Bar of bar] val pp_error : formatter -> error -> string Some nice combinators should be provided for using ('a, 'b) Result.t and ('a, 'b) Result.t Lwt. and for lifting an ('a, Foo.error) Result.t into an ('a, Bar.error) Result.t. Exceptions that escape their intended scope, should always be treated as a programming error. The various "finally" functions for resources should catch and reraise them, so that they can reach the outermost scope which knows how best to deal with a programming error in the particular application. The same goes for binding on an Lwt thread which raised an exception or failed: it should cause an exception to be raised to reach the outermost level. The aim here is still to take the erlang-style kill the component that failed and try again approach, but to ensure that there are two distinct return paths for regular errors and programming errors. The secondary aim is to have module signatures which give a clear indication of intended use. Regards, Leo _______________________________________________ MirageOS-devel mailing list MirageOS-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |