The built-in predicates described in this section are used to alter the
control flow to meet exception and error conditions. The equivalent of
a raise_exception/1
is also executed by the built-in predicates
when errors occur.
catch(
:ProtectedGoal,
?Pattern,
:Handler)
[ISO]
on_exception(
?Pattern,
:ProtectedGoal,
:Handler)
throw(
+Exception)
[ISO]
raise_exception(
+Exception)
catch/3
is the same as on_exception/3
(but note different
argument order), and throw/1
is the same as
raise_exception/1
.
on_exception/3
calls ProtectedGoal. If this succeeds or
fails, so does the call to on_exception/3
. If however, during
the execution of ProtectedGoal, there is a call to
raise_exception(
Exception)
, then Exception is copied
and the stack is unwound back to the call to on_exception/3
,
whereupon the copy of Exception is unified with Pattern. If
this unification succeeds, then on_exception/3
calls the goal
Handler in order to determine the success or failure of
on_exception/3
. Otherwise, the stack keeps unwinding, looking
for an earlier invocation of on_exception/3
. Exception may
be any term.
In a development system, any previously uncaught exception is caught and
an appropriate error message is printed before returning to the top
level. In recursive calls to Prolog from C, uncaught exceptions are
returned back to C instead. The printing of these and other messages in
a development system is handled by the predicate print_message/2
(see Messages and Queries).
The format of the exception raised by the built-in predicates depends on
the execution mode. In iso
execution mode the format is
error(ISO_Error, SICStus_Error)
where ISO_Error is the error term prescribed by the ISO Prolog standard, while SICStus_Error is the part defined by the standard to be implementation dependent. In case of SICStus Prolog this is the SICStus error term, which normally contains additional information, such as the goal and the argument number causing the error.
In sicstus
execution mode, the SICStus error term is
used when raising an exception in a built-in predicate.
The list below itemizes the error terms, showing the ISO_Error and SICStus_Error form of each one, in that order. Note that the SICStus and ISO error terms do not always belong to the same error class, and that the context and consistency error classes are extensions to the ISO Prolog standard.
The goal part of the error term may optionally have the form
$@(
Callable,
PC)
where PC is an internal
encoding of the line of code containing the culprit goal or one of its
ancestors.
instantiation_error
instantiation_error(
Goal,
ArgNo)
type_error(
TypeName,
Culprit)
type_error(
Goal,
ArgNo,
TypeName,
Culprit)
domain_error(
Domain,
Culprit)
domain_error(
Goal,
ArgNo,
Domain,
Culprit)
existence_error(
ObjectType,
Culprit)
existence_error(
Goal,
ArgNo,
ObjectType,
Culprit,
Reserved)
prolog_flag/3
) is set to error
, this
error is raised with ArgNo set to 0 when an undefined predicate is
called.
permission_error(
Operation,
ObjectType,
Culprit)
permission_error(
Goal,
Operation,
ObjectType,
Culprit,
Reserved)
context_error(
ContextType,
CommandType)
context_error(
Goal,
ContextType,
CommandType)
syntax_error(
Message)
syntax_error(
Goal,
Position,
Message,
Tokens,
AfterError)
read/[1,2]
or
assembling a number from its characters with number_chars/2
. In
the former case this error is raised only if the syntax_errors
flag (see prolog_flag/3
) is set to error
.
evaluation_error(
ErrorType,
Culprit)
evaluation_error(
Goal,
ArgNo,
ErrorType,
Culprit)
iso
execution mode.
representation_error(
ErrorType)
representation_error(
Goal,
ArgNo,
ErrorType)
consistency_error(
Culprit1,
Culprit2,
Message)
consistency_error(
Goal,
Culprit1,
Culprit2,
Message)
resource_error(
ResourceType)
resource_error(
Goal,
ResourceType)
memory
.
system_error
system_error(
Message)
It is possible to handle a particular kind of existence errors locally: calls to undefined predicates. This can be done by defining clauses for:
unknown_predicate_handler(
+Goal,
+Module,
-NewGoal)
[Hook]
user:unknown_predicate_handler(
+Goal,
+Module,
-NewGoal)
Called as a result of a call
to an undefined predicate. Goal is bound to the goal of the
undefined predicate and Module to the module where the call was
made. If this predicate succeeds, Module:NewGoal is called;
otherwise, the action taken is governed by the unknown
Prolog flag.
The following example shows an auto-loader for library packages:
user:unknown_predicate_handler(Goal, Module, Goal) :- functor(Goal, Name, Arity), require(Module:(Name/Arity)).