Как перебрать все error_info в boost :: exception?

На сайте перехвата boost :: exception (или std :: exception) я хочу перебрать все элементы error_info исключения, не зная типов. Мне нужно извлечь все пары имя-значение.

Я предполагаю, что это возможно, так как функция boost :: диагностика_информация делает это, но я бы хотел избежать дублирования всего этого кода.

Можно ли это сделать и как?

1

Решение

Там всегда следующая информация (если вы использовали BOOST_THROW_EXCEPTION):

char const * const * f=get_error_info<throw_file>(*be);
int const * l=get_error_info<throw_line>(*be);
char const * const * fn=get_error_info<throw_function>(*be);
if( !f && !l && !fn )
tmp << "Throw location unknown (consider using BOOST_THROW_EXCEPTION)\n";

Помимо этого вы должны использовать error_info_container, но data_ Участник приватный.

Если вы готовы «преодолеть» это препятствие, код для «дублирования» будет не таким уж большим:

char const *
diagnostic_information( char const * header ) const
{
if( header )
{
std::ostringstream tmp;
tmp << header;
for( error_info_map::const_iterator i=info_.begin(),end=info_.end(); i!=end; ++i )
{
error_info_base const & x = *i->second;
tmp << x.name_value_string();
}
tmp.str().swap(diagnostic_info_str_);
}
return diagnostic_info_str_.c_str();
}

Все, что там недокументировано, не является частью публичного API: оно живет в пространстве имен boost::exception_detail и класс boost::exception_detail::exception_info_container_impl,

Короче говоря, есть драконы (эти интерфейсы могут быть изменены без предварительного уведомления и могут зависеть от неожиданных предположений).


¹ (кроме некоторых старых компиляторов).

0

Другие решения

Других решений пока нет …