Как правильно использовать boost :: error_info? - PullRequest
10 голосов
/ 24 сентября 2010

Я пытаюсь следовать примерам на этой странице:

http://www.boost.org/doc/libs/1_40_0/libs/exception/doc/motivation.html

В ту минуту, когда я пробую следующую строку:

throw file_read_error() << errno_code(errno);

Я получаюошибка:

error C2440: '<function-style-cast>' : cannot convert from 'int' to 'errno_code'

Как мне заставить это работать ??

В идеале я хочу создать что-то вроде этого:

typedef boost::error_info<struct tag_HRESULTErrorInfo, HRESULT> HRESULTErrorInfo;

Но я не могу дажезаставить работать первые примеры.

Редактировать: Вот краткий пример того, что генерирует для меня ошибку C2440:

struct exception_base: virtual std::exception, virtual boost::exception { };
struct io_error: virtual exception_base { };
struct file_read_error: virtual io_error { };

typedef boost::error_info<struct tag_errno_code,int> errno_code;

void foo()
{
    // error C2440: '<function-style-cast>' : cannot convert from 'int' to 'errno_code'
    throw file_read_error() << errno_code(errno);
}

Ответы [ 3 ]

14 голосов
/ 24 сентября 2010
#include <boost/exception/all.hpp>

#include <boost/throw_exception.hpp>

#include <iostream>
#include <stdexcept>
#include <string>

typedef boost::error_info<struct my_tag,std::string> my_tag_error_info;

int
main()
{
    try {
        boost::throw_exception(
                boost::enable_error_info( std::runtime_error( "some error" ) ) 
                << my_tag_error_info("my extra info")
                );
    } catch ( const std::exception& e ) {
        std::cerr << e.what() << std::endl;
        if ( std::string const * extra  = boost::get_error_info<my_tag_error_info>(e) ) {
            std::cout << *extra << std::endl;
        }
    }
}

производит

samm@macmini> ./a.out 
some error
my extra info
7 голосов
/ 24 сентября 2010

Сэм Миллер дал мне понять, в чем проблема. Мне просто нужно было включить:

#include <boost/exception/all.hpp>

Спасибо за ваши ответы.

2 голосов
/ 24 сентября 2010

попробовать:

#include <boost/exception/error_info.hpp>
#include <errno.h>

throw file_read_error() << boost::errinfo_errno(errno);

еще лучше:

BOOST_THROW_EXCEPTION(file_read_error() << errinfo_errno(errno));

Ваш пример HRESULTErrorInfo кажется правильным.

...