--- /dev/null
+#ifndef TUT_EXCEPTION_H_GUARD
+#define TUT_EXCEPTION_H_GUARD
+
+#include <stdexcept>
+#include "tut_result.hpp"
+
+namespace tut
+{
+
+/**
+ * The base for all TUT exceptions.
+ */
+struct tut_error : public std::exception
+{
+ tut_error(const std::string& msg)
+ : err_msg(msg)
+ {
+ }
+
+ virtual test_result::result_type result() const
+ {
+ return test_result::ex;
+ }
+
+ const char* what() const throw()
+ {
+ return err_msg.c_str();
+ }
+
+ ~tut_error() throw()
+ {
+ }
+
+private:
+
+ std::string err_msg;
+};
+
+/**
+ * Group not found exception.
+ */
+struct no_such_group : public tut_error
+{
+ no_such_group(const std::string& grp)
+ : tut_error(grp)
+ {
+ }
+
+ ~no_such_group() throw()
+ {
+ }
+};
+
+/**
+ * Internal exception to be throwed when
+ * test constructor has failed.
+ */
+struct bad_ctor : public tut_error
+{
+ bad_ctor(const std::string& msg)
+ : tut_error(msg)
+ {
+ }
+
+ test_result::result_type result() const
+ {
+ return test_result::ex_ctor;
+ }
+
+ ~bad_ctor() throw()
+ {
+ }
+};
+
+/**
+ * Exception to be throwed when ensure() fails or fail() called.
+ */
+struct failure : public tut_error
+{
+ failure(const std::string& msg)
+ : tut_error(msg)
+ {
+ }
+
+ test_result::result_type result() const
+ {
+ return test_result::fail;
+ }
+
+ ~failure() throw()
+ {
+ }
+};
+
+/**
+ * Exception to be throwed when test desctructor throwed an exception.
+ */
+struct warning : public tut_error
+{
+ warning(const std::string& msg)
+ : tut_error(msg)
+ {
+ }
+
+ test_result::result_type result() const
+ {
+ return test_result::warn;
+ }
+
+ ~warning() throw()
+ {
+ }
+};
+
+/**
+ * Exception to be throwed when test issued SEH (Win32)
+ */
+struct seh : public tut_error
+{
+ seh(const std::string& msg)
+ : tut_error(msg)
+ {
+ }
+
+ virtual test_result::result_type result() const
+ {
+ return test_result::term;
+ }
+
+ ~seh() throw()
+ {
+ }
+};
+
+/**
+ * Exception to be throwed when child processes fail.
+ */
+struct rethrown : public failure
+{
+ explicit rethrown(const test_result &result)
+ : failure(result.message), tr(result)
+ {
+ }
+
+ virtual test_result::result_type result() const
+ {
+ return test_result::rethrown;
+ }
+
+ ~rethrown() throw()
+ {
+ }
+
+ const test_result tr;
+};
+
+}
+
+#endif