как я могу выбросить ошибку с файлом и бельем? - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь использовать BOOST_THROW_EXCEPTION, чтобы сделать это, вот пример :

#include <boost/throw_exception.hpp>
#include <stdexcept>
void demo_boost_throw()
{
    BOOST_THROW_EXCEPTION(std::runtime_error("boost throw std exception."));
    }
int main() {
    demo_boost_throw();
    return 0;
}

С здесь мы можем видеть, что он содержит файл

#define BOOST_THROW_EXCEPTION(x)\
        ::boost::throw_exception( ::boost::enable_error_info(x) <<\
        ::boost::throw_function(BOOST_THROW_EXCEPTION_CURRENT_FUNCTION) <<\
        ::boost::throw_file(__FILE__) <<\
        ::boost::throw_line((int)__LINE__) )

Но когда я запускаю программу, она не распечатывает файл и строку.

Существует current_exception_diagnostic_information(), но для этого требуется перехват и печать. Я не хочу это ловить. Я хочу, чтобы e.what () содержало дополнительную информацию о throw_function, throw_file и throw_line. Как я могу это сделать?

1 Ответ

0 голосов
/ 25 февраля 2020

Если у вас случайно есть доступ к C ++ 20 , вы можете легко использовать std::source_location следующим образом:

#include <string>
#include <sstream>
#include <iostream>
#include <experimental/source_location>

void throw_exception(std::string const& message,
                     std::experimental::source_location const& location = std::experimental::source_location::current()) {
    std::stringstream ss;
    ss << location.file_name()
       << ":"
       << location.line()
       << " "
       << message;
    throw std::runtime_error(ss.str());
}

int main() {
    throw_exception("Random exception");
    return 0;
}

Демо

...