#pragma once #ifndef _NB_ERROR #define _NB_ERROR #include #include #include #include namespace nb { typedef std::unordered_map ErrorCodeMap; class Error : public std::exception { public: Error(const unsigned int code=0, std::exception* const trace=nullptr) noexcept; Error(std::string, std::exception* const=nullptr) noexcept; Error(const Error&) noexcept; unsigned int code() const noexcept; virtual const char* type() const noexcept final; virtual const char* what() const noexcept override final; template friend const char* ErrorCodeLookup(unsigned int); protected: static const ErrorCodeMap ErrorCodes; Error( const unsigned int, std::string, std::exception* const, unsigned int line=0, std::string filename="" ) noexcept; const char* _type; const unsigned int _code; std::string _msg; }; template const char* ErrorCodeLookup(unsigned int code) { for (auto kv : NBError::ErrorCodes) { if (kv.first == code) { return kv.second; } } throw Error(666); } } // namespace nb #endif // _NB_ERROR