#pragma once extern int errorCode; extern std::string szError; void ILogFatalError(const char*); void ILogError(const char*); void ILogWarning(const char*); void ILogMessage(const char* format); void ILogVerbose(const char*); void ILogDebug(const char*); void queue_error_message(const char*); //Used for error conditions within a destructor because you cannot throw within a destructor void queue_fatal_error(const char*); //Used for fatal error conditions within a destructor in place of FatalException because you cannot throw within a destructor class MyException: public std::exception { private: std::string err; public: virtual ~MyException() override = default; MyException() = delete; explicit MyException(const std::string &m) noexcept :err(m){} explicit MyException(const char* sz) noexcept :err(sz) {} virtual const char* what() const override { return err.c_str(); } }; class FatalException : public MyException { public: using MyException::MyException; FatalException() noexcept; }; class HashReuseException : public MyException { public: using MyException::MyException; HashReuseException() noexcept; }; class SQLexception : public MyException { public: using MyException::MyException; SQLexception() noexcept; }; class NonUtf8DataInDatabase : public MyException { public: using MyException::MyException; NonUtf8DataInDatabase() noexcept; }; class BadDataException : public MyException { public: using MyException::MyException; BadDataException() noexcept; }; class NonRandomScalarException : public MyException { public: using MyException::MyException; NonRandomScalarException() noexcept; }; class BadScalarException : public MyException { public: using MyException::MyException; BadScalarException() noexcept; }; class OversizeBase58String : public MyException { public: using MyException::MyException; OversizeBase58String() noexcept; }; // This exception is obviously far too generic, because the routine throwing it knows nothing of the context. // does not know what the cryptographic id identifies. // higher level code that does know the context needs to catch the exception and issue a more // relevant errror message, possibly with by more informative rethrow. class BadStringRepresentationOfCryptoIdException : public MyException { public: using MyException::MyException; BadStringRepresentationOfCryptoIdException() noexcept; }; class NotBase58Exception : public MyException { public: using MyException::MyException; NotBase58Exception() noexcept; };