// Copyright (C) 2003 Davis E. King (davisking@users.sourceforge.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_ERROr_
#define DLIB_ERROr_
#include <string>
#include <new> // for std::bad_alloc
// -------------------------------
// ------ exception classes ------
// -------------------------------
namespace dlib
{
// ----------------------------------------------------------------------------------------
enum error_type
{
EOTHER,
EPORT_IN_USE,
ETIMEOUT,
ECONNECTION,
ELISTENER,
ERESOLVE,
EMONITOR,
ECREATE_THREAD,
ECREATE_MUTEX,
ECREATE_SIGNALER,
EUNSPECIFIED,
EGENERAL_TYPE1,
EGENERAL_TYPE2,
EGENERAL_TYPE3,
EINVALID_OPTION,
ETOO_FEW_ARGS,
ETOO_MANY_ARGS,
ESOCKET,
ETHREAD,
EGUI,
EFATAL,
EBROKEN_ASSERT,
EIMAGE_LOAD,
EDIR_CREATE,
EINCOMPATIBLE_OPTIONS,
EMISSING_REQUIRED_OPTION,
EINVALID_OPTION_ARG,
EMULTIPLE_OCCURANCES,
ECONFIG_READER,
EIMAGE_SAVE,
ECAST_TO_STRING,
ESTRING_CAST,
EUTF8_TO_UTF32
};
// ----------------------------------------------------------------------------------------
// the base exception class
class error : public std::exception
{
/*!
WHAT THIS OBJECT REPRESENTS
This is the base exception class for the dlib library. i.e. all
exceptions in this library inherit from this class.
!*/
public:
error(
error_type t,
const std::string& a
): info(a), type(t) {}
/*!
ensures
- #type == t
- #info == a
!*/
error(
error_type t
): type(t) {}
/*!
ensures
- #type == t
- #info == ""
!*/
error(
const std::string& a
): info(a), type(EUNSPECIFIED) {}
/*!
ensures
- #type == EUNSPECIFIED
- #info == a
!*/
error(
): type(EUNSPECIFIED) {}
/*!
ensures
- #type == EUNSPECIFIED
- #info == ""
!*/
virtual ~error(
) throw() {}
/*!
ensures
- does nothing
!*/
const char* what(
) const throw()
/*!
ensures
- if (info.size() != 0) then
- returns info.c_str()
- else
- returns type_to_string(type)
!*/
{
if (info.size() > 0)
return info.c_str();
else
return type_to_string();
}
const char* type_to_string (
) const throw()
/*!
ensures
- returns a string that names the contents of the type member.
!*/
{
if (type == EOTHER) return "EOTHER";
else if ( type == EPORT_IN_USE) return "EPORT_IN_USE";
else if ( type == ETIMEOUT) return "ETIMEOUT";
else if ( type == ECONNECTION) return "ECONNECTION";
else if ( type == ELISTENER) return "ELISTENER";
else if ( type == ERESOLVE) return "ERESOLVE";
else if ( type == EMONITOR) return "EMONITOR";
else if ( type == ECREATE_THREAD) return "ECREATE_THREAD";
else if ( type == ECREATE_MUTEX) return "ECREATE_MUTEX";
else if ( type == ECREATE_SIGNALER) return "ECREATE_SIGNALER";
else if ( type == EUNSPECIFIED) return "EUNSPECIFIED";
else if ( type == EGENERAL_TYPE1) return "EGENERAL_TYPE1";
else if ( type == EGENERAL_TYPE2) return "EGENERAL_TYPE2";
else if ( type == EGENERAL_TYPE3) return "EGENERAL_TYPE3";
else if ( type == EINVALID_OPTION) return "EINVALID_OPTION";
else if ( type == ETOO_FEW_ARGS) return "ETOO_FEW_ARGS";
else if ( type == ETOO_MANY_ARGS) return "ETOO_MANY_ARGS";
else if ( type == ESOCKET) return "ESOCKET";
else if ( type == ETHREAD) return "ETHREAD";
else if ( type == EGUI) return "EGUI";
else if ( type == EFATAL) return "EFATAL";
else if ( type == EBROKEN_ASSERT) return "EBROKEN_ASSERT";
else if ( type == EIMAGE_LOAD) return "EIMAGE_LOAD";
else if ( type == EDIR_CREATE) return "EDIR_CREATE";
else if ( type == EINCOMPATIBLE_OPTIONS) return "EINCOMPATIBLE_OPTIONS";
else if ( type == EMISSING_REQUIRED_OPTION) return "EMISSING_REQUIRED_OPTION";
else if ( type == EINVALID_OPTION_ARG) return "EINVALID_OPTION_ARG";
else if ( type == EMULTIPLE_OCCURANCES) return "EMULTIPLE_OCCURANCES";
else if ( type == ECONFIG_READER) return "ECONFIG_READER";
else if ( type == EIMAGE_SAVE) return "EIMAGE_SAVE";
else if ( type == ECAST_TO_STRING) return "ECAST_TO_STRING";
else if ( type == ESTRING_CAST) return "ESTRING_CAST";
else if ( type == EUTF8_TO_UTF32) return "EUTF8_TO_UTF32";
else return "undefined error type";
}
const std::string info; // info about the error
const error_type type; // the type of the error
private:
const error& operator=(const error&);
};
// ----------------------------------------------------------------------------------------
class fatal_error : public error
{
/*!
WHAT THIS OBJECT REPRESENTS
As the name says, this object represents some kind of fatal error.
It is also the exception thrown by the DLIB_ASSERT and DLIB_CASSERT macros.
!*/
public:
fatal_error(
error_type t,
const std::string& a
): error(t,a) {}
/*!
ensures
- #type == t
- #info == a
!*/
fatal_error(
error_type t
): error(t) {}
/*!
ensures
- #type == t
- #info == ""
!*/
fatal_error(
const std::string& a
): error(EFATAL,a) {}
/*!
ensures
- #type == EFATAL
- #info == a
!*/
fatal_error(
): error(EFATAL) {}
/*!
ensures
- #type == EFATAL
- #info == ""
!*/
};
// ----------------------------------------------------------------------------------------
class gui_error : public error
{
public:
gui_error(
error_type t,
const std::string& a
): error(t,a) {}
/*!
ensures
- #type == t
- #info == a
!*/
gui_error(
error_type t
): error(t) {}
/*!
ensures
- #type == t
- #info == ""
!*/
gui_error(
const std::string& a
): error(EGUI,a) {}
/*!
ensures
- #type == EGUI
- #info == a
!*/
gui_error(
): error(EGUI) {}
/*!
ensures
- #type == EGUI
- #info == ""
!*/
};
// ----------------------------------------------------------------------------------------
class socket_error : public error
{
public:
socket_error(
error_type t,
const std::string& a
): error(t,a) {}
/*!
ensures
- #type == t
- #info == a
!*/
socket_error(
error_type t
): error(t) {}
/*!
ensures
- #type == t
- #info == ""
!*/
socket_error(
const std::string& a
): error(ESOCKET,a) {}
/*!
ensures
- #type == ESOCKET
- #info == a
!*/
socket_error(
): error(ESOCKET) {}
/*!
ensures
- #type == ESOCKET
- #info == ""
!*/
};
// ----------------------------------------------------------------------------------------
class thread_error : public error
{
public:
thread_error(
error_type t,
const std::string& a
): error(t,a) {}
/*!
ensures
- #type == t
- #info == a
!*/
thread_error(
error_type t
): error(t) {}
/*!
ensures
- #type == t
- #info == ""
!*/
thread_error(
const std::string& a
): error(ETHREAD,a) {}
/*!
ensures
- #type == ETHREAD
- #info == a
!*/
thread_error(
): error(ETHREAD) {}
/*!
ensures
- #type == ETHREAD
- #info == ""
!*/
};
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_ERROr_