/* * SystemException.hh * * Created on: 8 сент. 2020 г. * Author: LeonidTitov */ #ifndef UMLIBRARY_SYSTEMIC_SYSTEMEXCEPTION_HH_ #define UMLIBRARY_SYSTEMIC_SYSTEMEXCEPTION_HH_ #include #include #include namespace systemic { struct SystemException : public std::exception { virtual std::size_t id() const noexcept = 0; virtual std::pair binary() const noexcept = 0; }; struct ExceptionInfo { virtual bool raised() const = 0; virtual std::size_t id() const = 0; virtual std::pair binary() const = 0; virtual const char * description() const = 0; }; class ExceptionHandler : public ExceptionInfo { public: //!Обработка исключения. void insert( std::size_t id, const char * data, std::size_t size, const char * description ); //!Обработка исключения. void handle( const std::exception & exception ) noexcept; void notify() noexcept; struct NotificationInterface { virtual void notify( std::size_t id, const char * data, std::size_t size, const char * description ) = 0; virtual ~NotificationInterface() = default; }; static NotificationInterface & getDefault() { struct DefaultHerald : public NotificationInterface { void notify( std::size_t id, const char * data, std::size_t size, const char * description ) {} }; static DefaultHerald herald; return herald; } ExceptionHandler( char * buffer, std::size_t size, NotificationInterface & herald = getDefault() ); bool raised() const; std::size_t id() const; std::pair binary() const; const char * description() const; private: NotificationInterface & herald; std::size_t exception_id; std::size_t exception_size; const std::pair buffer; const char * what_happens = nullptr; bool is_handled = false; }; } #endif /* UMLIBRARY_SYSTEMIC_SYSTEMEXCEPTION_HH_ */