// Exception Handling support header for -*- C++ -*-

#ifndef __EXCEPTION__
#define __EXCEPTION__

extern "C++" {

namespace std
{
  /**
   * @defgroup exceptions Exceptions
   * @ingroup diagnostics
   *
   * Classes and functions for reporting errors via exception classes.
   * @{
   */

  /**
   *  @brief Base class for all library exceptions.
   *
   *  This is the base class for all exceptions thrown by the standard
   *  library, and by certain language expressions.  You are free to derive
   *  your own %exception classes, or use a different hierarchy, or to
   *  throw non-class data (e.g., fundamental types).
   */
  class exception
  {
  public:
    exception() throw() { }
    virtual ~exception() throw();

    /** Returns a C-style character string describing the general cause
     *  of the current error.  */
    virtual const char* what() const throw();
  };

  /** If an %exception is thrown which is not listed in a function's
   *  %exception specification, one of these may be thrown.  */
  class bad_exception : public exception
  {
  public:
    bad_exception() throw() { }

    virtual ~bad_exception() throw();

    virtual const char* what() const throw();
  };

  typedef void (*unexpected_handler) ();

  unexpected_handler set_unexpected(unexpected_handler) throw();

  DECLSPEC_NORETURN void unexpected();

  bool uncaught_exception() throw();

  // @} group exceptions
} // namespace std

typedef void (*terminate_handler) ();
terminate_handler set_terminate(terminate_handler) throw();
DECLSPEC_NORETURN void terminate() throw();

} // extern "C++"

#endif