[mercury-users] exceptions considered bloody annoying
Fergus Henderson
fjh at cs.mu.OZ.AU
Tue Apr 16 19:05:13 AEST 2002
On 15-Apr-2002, Michael Day <mikeday at bigpond.net.au> wrote:
>
> During the debates relating to a streams design for Mercury a number of
> potential interfaces were scrapped as they didn't work well with
> exceptions. One of the final contenders was with_stream:
>
> pred with_stream(filename, pred(stream, stream), io, io).
> mode with_stream(in, pred(di, uo) is det, di, uo) is cc_multi.
>
> or along those lines. It would catch any exceptions thrown by the
> predicate and close files or deallocate resources before rethrowing the
> exception, guaranteeing no leaks.
>
> It's not an amazing interface, as user code has to be structured
> specifically to use it and it can be awkward to manipulate multiple
> streams at once in an arbitrary fashion. Also it's cc_multi, which
> effectively makes everything cc_multi, and confuses people.
So declare it as `det' rather than `cc_multi'.
`promise_only_solution_io' is there for a reason.
Sometimes you need to use it. In a case like this,
where you are always rethrowing after you catch,
it is sound to declare the procedure as `det'
and to use `promise_only_solution_io'.
> I have a similar interface to with_stream that looks like this:
>
> pred with_stuff(pred(stuff, T, T), T, T, io, io).
> mode with_stuff(pred(in, di, uo) is det, di, uo, di, uo) is det.
...
> So, with_stuff has to catch all exceptions and then throw a *different*
> exception, along the lines of "this code threw the following exception".
>
> And again, everything ends up cc_multi.
Likewise here -- use promise_only_solution_io.
Perhaps this pattern occurs often enough that it should be abstracted
and put into the standard library.
--
Fergus Henderson <fjh at cs.mu.oz.au> | "I have always known that the pursuit
The University of Melbourne | of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.
--------------------------------------------------------------------------
mercury-users mailing list
post: mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the users
mailing list