etk/etk-core/Exception.hpp

221 lines
5.7 KiB
C++

/**
* @author Edouard DUPIN
* @copyright 2017, Edouard DUPIN, all right reserved
* @license MPL-2 (see license file)
*/
#pragma once
#include <etk/types.hpp>
#include <etk/String.hpp>
namespace etk {
/**
* @brief Global exception handle
*/
class Exception {
private:
const char* m_type = null; //!< type of the exception
const etk::String m_what = "? ? ?"; //!< problem exception type
const char* m_function = null; //!< Function where the exception is generated
const char* m_file = null; //!< File where the excepton append
size_t m_line = 0; //!< Line of the exception
public:
/**
* @brief Default constructor.
*/
Exception();
/**
* @brief Generic Constructor (direct generic exception.
* @param[in] _what The explanation of the problem.
*/
Exception(const etk::String& _what);
/**
* @brief Generic Constructor.
* @param[in] _type Type of the exception
* @param[in] _what The explanation of the problem.
*/
Exception(const char* _type, const etk::String& _what);
/**
* @brief virtualize destructor.
*/
virtual ~Exception() = default;
/**
* @brief Get the type of the exception.
* @return String name of the exception.
*/
const char* which() const;
/**
* @brief Get the explanation of the problem.
* @return Descriptive string.
*/
const etk::String what() const;
/**
* @brief Get the Name of the file where the exception is generated.
* @return File string or null
*/
const char* file() const;
/**
* @brief Set the file Name.
* @param[in] _value File string or null
*/
etk::Exception& setFile(const char* _value);
/**
* @brief Get the Name of the fuction where the exception is generated.
* @return Function string or null
*/
const char* function() const;
/**
* @brief Set the function Name.
* @param[in] _value Function string or null
*/
etk::Exception& setFunction(const char* _value);
/**
* @brief Line Index in the file where thre throw append
* @return Line in the file
*/
size_t line() const;
/**
* @brief Set the file line.
* @param[in] _value File line.
*/
etk::Exception& setLine(size_t _value);
/**
* @brief Convert the class in String.
* @return generating desription of class
*/
etk::String toString() const;
};
#define ETK_THROW_EXCEPTION(ex) do { \
auto tmp = ex; \
tmp.setFunction(__PRETTY_FUNCTION__); \
tmp.setFile(__FILE__); \
tmp.setLine(__LINE__); \
throw tmp; \
} while(false)
//! @brief Generic
namespace exception {
class InvalidArgument : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
InvalidArgument(const etk::String& _what):
etk::Exception("INVALID-ARGUMENT", _what) {
}
};
class DomainError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
DomainError(const etk::String& _what):
etk::Exception("DOMAIN-ERROR", _what) {
}
};
class LengthError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
LengthError(const etk::String& _what):
etk::Exception("LENGTH-ERROR", _what) {
}
};
class OutOfRange : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
OutOfRange(const etk::String& _what):
etk::Exception("OUT-OF-RANGE", _what) {
}
};
class RangeError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
RangeError(const etk::String& _what):
etk::Exception("RANGE-ERROR", _what) {
}
};
class OverflowError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
OverflowError(const etk::String& _what):
etk::Exception("OVERFLOW-ERROR", _what) {
}
};
class UnderflowError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
UnderflowError(const etk::String& _what):
etk::Exception("UNDERFLOW-ERROR", _what) {
}
};
class CastError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
CastError(const etk::String& _what):
etk::Exception("CAST-ERROR", _what) {
}
};
class AllocationError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
AllocationError(const etk::String& _what):
etk::Exception("ALLOCATION-ERROR", _what) {
}
};
class RuntimeError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
RuntimeError(const etk::String& _what):
etk::Exception("RUNTIME-ERROR", _what) {
}
};
class NullPointerError : public etk::Exception {
public:
/**
* @brief Contructor of an generic Exception.
* @param[in] _what The explanation of the problem.
*/
NullPointerError(const etk::String& _what):
etk::Exception("NULL-POINTER-ERROR", _what) {
}
};
}
}