记录boost :: exception,同时避免文件/行/函数和唠叨

时间:2011-09-23 14:23:15

标签: c++ boost exception-handling

在我的内部日志库中,我试图将自定义异常类更改为派生自boost :: exception而不是std :: exception。我这样做,以便我可以使用单个catch块来同时提升异常和我的应用程序异常。但是我在登录时遇到了一个问题。

使用boost :: diagnostic_information()记录异常时,我得到了关于throw位置的整个9码。这些信息对我来说是多余的,因为我的自定义类已经以我想要的方式收集和使用此信息。我不想在日志中打印源代码文件/行/功能信息。

如果我定义BOOST_EXCEPTION_DISABLE或不使用BOOST_THROW_EXCEPTION,则每次记录异常时都会打印“丢弃位置未知(考虑使用BOOST_THROW_EXCEPTION)”。

但是如何摆脱这种唠叨?

2 个答案:

答案 0 :(得分:4)

好吧,我想我自己找到了答案。首先,我不必从boost :: exception派生我的类,我仍然可以继续从std :: exception派生。但是,我应该使用BOOST_THROW_EXCEPTION抛出我的std :: exception派生类。所以当它起飞时它变成了boost :: exception。 : - )

在两者之间,如果需要捕捉和重新抛出,我可以添加更多信息。

  typedef boost::error_info<struct tag_errmsg, std::string> exceptionInfo; 

  catch (boost::exception &e) 
  { 
    e << exceptionInfo("some more exception data"); 
    throw; 
  } 

然后我终于可以抓住它并以这种方式打印出来:

catch (boost::exception &e) 
{ 
    std::exception const * se = dynamic_cast<std::exception const *>(&e);
    if(se)
    {
        // will enter here only for my application exception and not for pure boost exception
        std::cout << "STD: " << se->what();
    }
    std::cout << " BOOST: " << *boost::get_error_info<exceptionInfo>(e);        }
} 

这样我将从std :: exception获取what()字符串,并从boost :: exception获取错误消息。我是在正确的轨道上吗?

答案 1 :(得分:0)

你不想使用exception :: what()而不是boost :: diagnostic_information()吗?