【问题标题】:How to iterate over all error_info's in boost::exception?如何遍历 boost::exception 中的所有 error_info?
【发布时间】:2018-06-19 20:02:49
【问题描述】:

在 boost::exception(或 std::exception)的捕获点,我想在不知道类型的情况下遍历异常的所有 error_info 元素。我需要提取所有的名称-值对。

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

这可以做到吗?如何做到?

【问题讨论】:

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


    【解决方案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

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


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

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2012-10-14
      相关资源
      最近更新 更多