PlException, there are convenience functions that create 
and wrap a Prolog term, similar to the PL_domain_error(), etc. 
The hierarchy allows catch statements to easily handle 
combinations.
A PlException object contains a Prolog term, so its
what() method must be called either 
within a Prolog predicate or within the context of a PlEngine 
(and PlFrame; see section 
1.16). The term is copied so that it is available outside of the 
context of the frame that created it.
std::exception
*-- PlExceptionBase
    *-- PlException
    |   *.. PlDomainError()
    |   *.. PlExistenceError()
    |   *.. PlGeneralError()
    |   *.. PlInstantiationError()
    |   *.. PlPermissionError()
    |   *.. PlRepresentationError()
    |   *.. PlResourceError()
    |   *.. PlTypeError()
    |   *.. PlUninstantiationError()
    |   *.. PlUnknownError()
    *-- PlExceptionFailBase
    |   *-- PlExceptionFail
    |   *-- PlFail
    *-- PlEngineInitialisationFailed
    *-- PlOpenForeignFrameFailed
Note that everything under PlException can contain a 
Prolog term; if the what() method is 
called, it must be within the context of a Prolog frame. If you wish to 
pass the exception outside the frame, you can use the set_what_str() 
method to avoid evaluating the term after it has been freed by Prolog:
  try
  { PlCall("p(123)");
      ...
  } catch ( PlException &ex )
  { ex.set_what_str();
    throw; // rethrow the exception
  }
Currently defined methods are:
  ...;
  try
  { PlCall("consult(load)");
  } catch ( const PlException& ex )
  { cerr << ex.as_string() << endl;
  }