The typical implementation of a foreign predicate first uses the 
PL_get_*() functions to extract C data types from the Prolog terms. 
Failure of any of these functions is normally because the Prolog term is 
of the wrong type. The *_ex() family of functions are wrappers 
around (mostly) the PL_get_*() functions, such that we can write code in 
the style below and get proper exceptions if an argument is 
uninstantiated or of the wrong type. Section 
12.4.8 documents an alternative API to fetch values for the C basic 
types.
/** set_size(+Name:atom, +Width:int, +Height:int) is det.
static foreign_t
set_size(term_t name, term_t width, term_t height)
{ char *n;
  int w, h;
  if ( !PL_get_chars(name, &n, CVT_ATOM|CVT_EXCEPTION) ||
       !PL_get_integer_ex(with, &w) ||
       !PL_get_integer_ex(height, &h) )
    return FALSE;
  ...
}
- bool PL_get_atom_ex(term_t 
t, atom_t *a)
- As PL_get_atom(), 
but raises a type or instantiation error if
t is not an atom.
- bool PL_get_integer_ex(term_t 
t, int *i)
- As PL_get_integer(), 
but raises a type or instantiation error if
t is not an integer, or a representation error if the Prolog 
integer does not fit in a C int.
- bool PL_get_long_ex(term_t 
t, long *i)
- As PL_get_long(), 
but raises a type or instantiation error if
t is not an atom, or a representation error if the Prolog 
integer does not fit in a C long.
- bool PL_get_int64_ex(term_t 
t, int64_t *i)
- As PL_get_int64(), 
but raises a type or instantiation error if
t is not an integer, or a representation error if the Prolog 
integer does not fit in a C int64_t.
- bool PL_get_uint64_ex(term_t 
t, uint64_t *i)
- As PL_get_uint64(), 
but raises a type, domain or instantiation error if
t is not an integer or t is less than zero, or a 
representation error if the Prolog integer does not fit in a C
int64_t.
- bool PL_get_intptr_ex(term_t 
t, intptr_t *i)
- As PL_get_intptr(), 
but raises a type or instantiation error if
t is not an atom, or a representation error if the Prolog 
integer does not fit in a C intptr_t.
- bool PL_get_size_ex(term_t 
t, size_t *i)
- As PL_get_intptr(), 
but raises a type or instantiation error if
t is not an integer, or a representation error if the Prolog 
integer does not fit in a C size_t.
- bool PL_get_bool_ex(term_t 
t, int *i)
- As PL_get_bool(), 
but raises a type or instantiation error if t is not a valid 
boolean value (true,false,on, 
constoff,1or0). Note that the pointer is to 
anintbecause C has nobooltype.
- bool PL_get_float_ex(term_t 
t, double *f)
- As PL_get_float(), 
but raises a type or instantiation error if
t is not a float.
- bool PL_get_char_ex(term_t 
t, int *p, int eof)
- Get a character code from t, where t is either an 
integer or an atom with length one. If eof is TRUEand t is -1, p is filled with -1. Raises an 
appropriate error if the conversion is not possible.
- bool PL_get_pointer_ex(term_t 
t, void **addrp)
- As PL_get_pointer(), 
but raises a type or instantiation error if
t is not a pointer.
- bool PL_get_list_ex(term_t 
l, term_t h, term_t t)
- As PL_get_list(), 
but raises a type or instantiation error if
t is not a list.
- bool PL_get_nil_ex(term_t 
l)
- As PL_get_nil(), 
but raises a type or instantiation error if
t is not the empty list. Because PL_get_nil_ex() 
is commonly used after a whileloop over PL_get_list_ex(), 
it fails immediately if there is an exception pending (from PL_get_list_ex()).
- bool PL_unify_list_ex(term_t 
l, term_t h, term_t t)
- As PL_unify_list(), 
but raises a type error if t is not a variable, list-cell or 
the empty list.
- bool PL_unify_nil_ex(term_t 
l)
- As PL_unify_nil(), 
but raises a type error if t is not a variable, list-cell or 
the empty list.
- bool PL_unify_bool_ex(term_t 
t, int val)
- As PL_unify_bool(), 
but raises a type error if t is not a variable or a boolean.
The second family of functions in this section simplifies the 
generation of ISO compatible error terms. Any foreign function that 
calls this function must return to Prolog with the return code of the 
error function or the constant FALSE. If available, these 
error functions add the name of the calling predicate to the error 
context. See also PL_raise_exception().
- bool PL_instantiation_error(term_t 
culprit)
- Raise instantiation_error. Culprit is ignored, 
but should be bound to the term that is insufficiently instantiated. See
instantiation_error/1.
- bool PL_uninstantiation_error(term_t 
culprit)
- Raise uninstantiation_error(culprit). This should be called 
if an argument that must be unbound at entry is bound to culprit. 
This error is typically raised for a pure output arguments such as a 
newly created stream handle (e.g., the third argument of open/3).
- bool PL_representation_error(const 
char *resource)
- Raise representation_error(resource). See representation_error/1.
- bool PL_type_error(const 
char *expected, term_t culprit)
- Raise type_error(expected, culprit). See type_error/2.
- bool PL_domain_error(const 
char *expected, term_t culprit)
- Raise domain_error(expected, culprit). See domain_error/2.
- bool PL_existence_error(const 
char *type, term_t culprit)
- Raise existence_error(type, culprit). See existence_error/2.
- bool PL_permission_error(const 
char *operation, const char *type, term_t culprit)
- Raise permission_error(operation, type, culprit). See
permission_error/3.
- bool PL_resource_error(const 
char *resource)
- Raise resource_error(resource). See resource_error/1.
- bool PL_syntax_error(const 
char *message, IOSTREAM *in)
- Raise syntax_error(message). If arg is notNULL, 
add information about the current position of the input stream.