我希望通过继承std :: exception来向我的日志文件添加特定信息,但我不知道如何访问std :: exception的.what()方法。
此外,我知道在异常处理程序中创建字符串是不安全的,但我对这个主题不是很熟悉,那么有什么更安全的选择吗?
编辑: 我真的把问题问错了。我对安全很感兴趣,只是认为有更多的数据进行日志记录会很好。我错了。
现在,我不再对消息字符串可能抛出bad_alloc异常感到如此偏执,我宁愿有一个整洁的消息。话虽如此,我重写了一些东西:
此外,我知道在异常处理程序中创建字符串是不安全的,但我对这个主题不是很熟悉,那么有什么更安全的选择吗?
struct Exception : public std::exception, private boost::noncopyable
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
std::string what = message + // and now what? base.what()
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
编辑: 我真的把问题问错了。我对安全很感兴趣,只是认为有更多的数据进行日志记录会很好。我错了。
现在,我不再对消息字符串可能抛出bad_alloc异常感到如此偏执,我宁愿有一个整洁的消息。话虽如此,我重写了一些东西:
struct Exception : public std::exception
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
现在还有没有关于那段代码的大问题呢?如果发生错误,LOG()会抛出std::exception异常,因为我不希望派生异常类无限循环调用日志,而导致再次出现相同的异常。 这样做会按照我想要的方式运作吗?或者在我的派生类中记录异常时,会调用terminate()或导致核心转储?
bad_alloc
的风险)。两者都与特定于派生自std::exception
没有任何关系。分开提出具体问题会导致更具描述性的问题标题和更有用的答案。请考虑拆分此问题。 - Rob Kennedy