如何迭代boost :: exception中的所有error_info?

时间:2018-01-10 15:38:44

标签: c++ boost exception-handling boost-exception

在boost :: exception(或std :: exception)的catch站点,我想迭代异常的所有error_info元素,而不知道类型。我需要提取所有的名称 - 值对。

我想应该可以,因为boost :: diagnostic_information函数可以做到这一点,但我想避免重复所有代码。

可以这样做吗?

1 个答案:

答案 0 :(得分:0)

总是有以下信息(如果您使用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中。

简而言之,有龙(这些界面如有变更,恕不另行通知,可能取决于令人惊讶的假设)。

¹(某些较旧的编译器除外)。