Представьте повышение :: исключение для меня - PullRequest
3 голосов
/ 05 февраля 2011

Меня просят создать "настраиваемую структуру исключений", используя boost :: exception.До даты я использовал только простые определенные мной исключения.Так что std :: exception, boost :: exception являются новыми для меня.Код ниже.

#include <iterator>
#include<string>
#include <algorithm>
#include<errno.h>

struct My_exception:public virtual boost::exception
{
};

int main()
{
std::string fileName="tmp.txt";
std::string mode="r";

    try
    {
        if(fopen(fileName.c_str(),mode.c_str()))
            std::cout << " file opened " << std::endl ;
        else
        {
            My_exception e;
            e << boost::errinfo_api_function("fopen") <<   boost::errinfo_file_name(fileName)
            << boost::errinfo_file_open_mode(mode) << boost::errinfo_errno(errno);

            throw e;
        }
    }
    catch(My_exception e)
    {
    // extract the  details here //
    }
    return 1;
}

Теперь я хочу узнать, как извлечь данные из этого пойманного исключения.Кто-нибудь может направить меня на путь повышения :: исключение

1 Ответ

6 голосов
/ 05 февраля 2011

Прежде всего, ваш код содержит ошибку, например, вы не можете написать это:

e << boost::errinfo_api_function("fopen")

Поскольку errinfo_api_function может использоваться только с int.Так что сделайте что-то вроде этого:

  e << boost::errinfo_api_function(100) //say 100 is error code for api error

См. Параметр второго типа для errinfo_api_function 1 , это int.Аналогичным образом проверьте другие шаблоны классов ошибок.Я дал ссылку на каждую из них, которую вы используете, в конце этого поста!

1.Кажется, есть две версии этого шаблона класса, одна из которых занимает int, другая - const char*.Сравните версия 1.40.0 errinfo_api_function с версия 1.45.0 errinfo_api_function .Спасибо dalle , который указал на это в комментарии.: -)


Используйте шаблон функции get_error_info для получения данных из boost::exception.

Посмотрите, что boost :: exception документация гласит:

Чтобы извлечь данные из объекта boost :: exception, используйте шаблон функции get_error_info.


Пример кода:

//since second type of errinfo_file_name is std::string
std::string fileError = get_error_info<errinfo_file_name>(e); 

//since second type of errinfo_errno is int
int errno = get_error_info<errinfo_errno>(e);

//since second type of errinfo_file_open_mode is std::string
std::string mode = get_error_info<errinfo_file_open_mode>(e);

//since second type of errinfo_api_function is int
int apiError = get_error_info<errinfo_api_function>(e);

См. Их для лучшего понимания:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...