MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/systemic/SystemException.cpp

92 lines
1.8 KiB
C++

/*
* SystemException.cpp
*
* Created on: 8 ñåíò. 2020 ã.
* Author: LeonidTitov
*/
#include "SystemException.hh"
#include <cstring>
void systemic::ExceptionHandler::handle( const std::exception & exception ) noexcept {
if( is_handled )
return;
what_happens = exception.what();
const SystemException * system_exception = dynamic_cast<const SystemException *>( &exception );
std::pair<const char *, std::size_t> data( nullptr, 0 );
if( system_exception ) {
exception_id = system_exception->id();
data = system_exception->binary();
if( buffer.second >= data.second )
std::memcpy( buffer.first, data.first, exception_size = data.second );
}
is_handled = true;
notify();
}
systemic::ExceptionHandler::ExceptionHandler( char * buffer, std::size_t size, NotificationInterface & herald )
: buffer( buffer, size ), herald(herald) {}
bool systemic::ExceptionHandler::raised() const {
return is_handled;
}
std::size_t systemic::ExceptionHandler::id() const {
return exception_id;
}
std::pair<const char *, std::size_t> systemic::ExceptionHandler::binary() const {
return { buffer.first, exception_size };
}
const char * systemic::ExceptionHandler::description() const {
return what_happens;
}
void systemic::ExceptionHandler::insert( std::size_t id, const char * data,
std::size_t size,
const char * description ) {
exception_id = id;
if( size < buffer.second )
std::memcpy( buffer.first, data, exception_size = size );
what_happens = description;
is_handled = true;
}
void systemic::ExceptionHandler::notify() noexcept {
try {
herald.notify( exception_id, buffer.first, exception_size, what_happens );
} catch( ... ) {}
}