Integrating Boost Exception in Existing Exception Class Hierarchies
Некоторые иерархии исключений не могут быть изменены для повышения:ИсключениеБазовый тип. В этом случаевключить_error_infoШаблон функций может быть использован для того, чтобы объекты исключений выводились из импульса:ИсключениеВ любом случае. Вот пример:
#include <boost/exception/all.hpp>
#include <stdexcept>
typedef boost::error_info<struct tag_std_range_min,size_t> std_range_min;
typedef boost::error_info<struct tag_std_range_max,size_t> std_range_max;
typedef boost::error_info<struct tag_std_range_index,size_t> std_range_index;
template <class T>
class
my_container
{
public:
size_t size() const;
T const &
operator[]( size_t i ) const
{
if( i > size() )
throw boost::enable_error_info(std::range_error("Index out of range")) <<
std_range_min(0) <<
std_range_max(size()) <<
std_range_index(i);
//....
}
};
Призыв квключить_error_infoдает нам объектнеопределенного типа, который гарантированно вытекает из обоих импульсов::исключениеи T. Это позволяет использоватьоператора<<для хранения дополнительной информации в объекте исключения. Исключение может быть перехвачено как T &, поэтому существующая обработка исключений не будет нарушена. Он также может быть перехвачен как усилие:исключение& так чтобольше информации может быть добавлено к исключению в более позднее время.