Повышение исключения во время выполнения - PullRequest
2 голосов
/ 17 февраля 2009

Используя этот код:

#include <fstream>

#include <boost/archive/text_oarchive.hpp>

using namespace std;

int main()
{
    std::ofstream ofs("c:\test");
    boost::archive::text_oarchive oa(ofs);
}

Я получаю необработанное исключение во время выполнения при выполнении строки буст-архива:

boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::archive::archive_exception> >

Ответы [ 2 ]

6 голосов
/ 17 февраля 2009

Ошибка в следующей строке:

 std::ofstream ofs("c:\test");

Компилятор выложил бы предупреждение (по крайней мере), если бы ваш файл назывался jest; но '\t' - поскольку вы не можете вставить вкладку, ваша ошибка остается необработанной. Короче говоря, файл не будет создан. Вы можете проверить это с помощью:

if (ofs.good()) { ... }

Теперь, поскольку файл не был создан, у вас нет действительного итератора для передачи на boost::archive::text_oarchive, который выдает исключение.

Попробуйте это:

std::ofstream ofs("c:\\test");
//                  --^ (note the extra backslash)
if (ofs.good()) {
    boost::archive::text_oarchive oa(ofs);
    // ...
}

Надеюсь, это поможет!

PS: Последняя гнида, которую я не мог помешать себе сделать - если вы собираетесь использовать

using namespace std;

затем

ofstream ofs("c:\\test");

достаточно хорошо. Конечно, квалификация ofstream не является ошибкой, но это не лучший стиль кодирования. Но тогда вы знаете, что использование using namespace - это плохо, не так ли?

PPS : Спасибо - sharptooth за напоминание о том, что \t дает вам вкладку!

2 голосов
/ 17 февраля 2009

Вам нужно перехватить исключение, а затем изучить его код_исключения, чтобы увидеть причину.

...