Skip to content
Sebastian edited this page Jul 1, 2020 · 2 revisions

Information on error handling:

Error messages

When throwing errors using throw/1, one should always throw terms of the shape error(Formal, Context) (as opposed to timeouts, aborts and user specific exceptions that are not "errors"), as error/2 is recognised by the debugger to take action under some condition.

An error/2 message is parsed by the following DCG rule in library/prolog_stack.pl:

prolog:message(error(Error, context(Stack, Message))) -->
    { Message \== 'DWIM could not correct goal',
      is_stack(Stack, Frames)
    },
    !,
    '$messages':translate_message(error(Error, context(_, Message))),
    [ nl, 'In:', nl ],
    (   {is_list(Frames)}
    ->  message(Frames)
    ;   ['~w'-[Frames]]
    ).

and rule for translate_message/1 is defined in boot/message.pl which itself uses iso_message/1 to translate Formal error Terms to String messages.

Some ISO formal error Terms are type_error, instantiation_error, or existence_error.

There are also SWI specific errors, translated via swi_message/1 in the same file.

So, if one would like to introduce a new Formal error name, say jpl_state_error, one would need to throw a term of the shape error(jpl_state_error, ...) but also define a DCG rule of the form:

prolog:error_message(jpl_state_error) --> ...

See Printing Messages in SWI-Prolog tutorial for more information on how errors are handled in a convenient and flexible way, so that library users can manage those errors the way they want/need.