[mercury-users] Exception handling documentation.
pbone at csse.unimelb.edu.au
Thu Jul 17 15:52:18 AEST 2008
On Thu, Jul 17, 2008 at 03:43:02PM +1000, Julien Fischer wrote:
> On Thu, 17 Jul 2008, Paul Bone wrote:
> >On Thu, Jul 17, 2008 at 02:30:30PM +1000, Julien Fischer wrote:
> >>On Thu, 17 Jul 2008, Paul Bone wrote:
> >>>io.close_output throws an exception if bad stuff happens. I don't see
> >>>any information in the language reference guide about exceptions, this
> >>>is probably a bug.
> >>exceptions are a library feature so they are documented in the library
> >>reference guide. (The reference manual of course documents the
> >>determinism erroneous).
> >Ah, Found it :-).
> >>>Alot of the io package returns errors as part of their return value.
> >>>Should this be consitant and always return a type that can be used to
> >>>check for errors?
> >>It is fairly consistent isn't it. Those that throw an exception
> >>put the error inside of the exception.
> >Some throw exceptions and others return values. This is the bit that's
> >not consitant.
> >When I use try_io to try a closure and catch exceptions it requires that
> >it's parent be cc_multi or multi, and that that predicate's parent is
> >cc_multi or multi.
> It requires that it is cc_multi, not multi.
> I thought that the idea of cc_multi was that it
> >behaved like det but semantically there could be more solutions that
> >would _never_ be found.
> No, semantically there are more solutions but we are *committing* to one.
> In the case of try_io there are multiple possible I/O states.
How can that help me? I'd like my write predicate to be deterministic so
I have to throw away the cc_multi somewhere.
I tried putting the call to try_io in a some scope, this didn't work either:
% Write the feedback to the given output stream. This predicate is
% seperated from the above predicate so that the mode checker is happy with
% the use of try_io.
/* ### In `write2'(in, in, in, out, di, uo): */
/* ### error: determinism declaration not satisfied. */
/* ### Declared `det', inferred `multi'. */
:- pred write2(output_stream::in, string::in, feedback_state::in,
feedback_write_result::out, io::di, io::uo) is det.
write2(Stream, ProgName, Feedback, Res, !IO) :-
some [!IO2, ExcpResPrime]
!:IO2 = !.IO,
/* ### call to `exception.try_io'((pred(out, di, uo) is det), */
/* ### out((exception.cannot_fail)), di, uo) can succeed more than */
/* ### once. */
/* ### Error: call to predicate `exception.try_io'/4 with determinism */
/* ### `cc_multi' occurs in a context which requires all solutions. */
try_io(write3(Stream, ProgName, Feedback), ExcpResPrime, !IO2),
ExcpRes = ExcpResPrime,
!.IO2 = !:IO
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 189 bytes
Desc: Digital signature
More information about the users