[mercury-users] Exception handling documentation.

Paul Bone pbone at csse.unimelb.edu.au
Thu Jul 17 15:20:03 AEST 2008


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.  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.


/* ### 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) :-
/* ###   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), ExcpRes, !IO),
    (   
        ExcpRes = succeeded(_),
        Res = ok
    ;   
        ExcpRes = exception(ExcpUniv),

        %
        % If the exception is not a type we exected then re-throw it.
        %
        (   
            univ_to_type(ExcpUniv, Excp)
        ->  
            Res = write_error(Excp)
        ;
            rethrow(ExcpRes)
        )
    ).


Mercury Compiler, version rotd-2008-07-07, configured for i686-pc-linux-gnu
Copyright (C) 1993-2008 The University of Melbourne


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mercurylang.org/archives/users/attachments/20080717/58e51afb/attachment.sig>


More information about the users mailing list