【发布时间】:2011-01-31 23:15:09
【问题描述】:
我想从 std::exception 派生以将特定信息添加到我的日志文件中,但我不知道如何从 std::exception 访问 .what()。
此外,我知道在我的异常处理程序中创建字符串是不安全的,但我不是该主题的专家,那么有哪些更安全的替代方案?
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,我不会对消息字符串抛出 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 以防万一出现问题,因为我不希望派生异常类调用日志的无限循环,并且该类再次调用 log 会再次导致相同的异常。 这会像我想要的那样工作吗,或者派生类调用中的日志记录异常终止()或导致核心转储?
【问题讨论】:
-
回复:更安全的替代品。这是一个很大的问题。适合它自己的问题。
-
欢迎来到 Stack Overflow。您似乎在问 两个 问题(这意味着您应该发表两个单独的帖子)。一个询问如何从基类调用继承的方法,另一个询问如何在没有字符串的情况下存储异常消息(大概是因为您不想分配内存并招致
bad_alloc的风险)。两者都与特别是从std::exception派生无关。单独的具体问题会导致更具描述性的问题标题和更有用的答案。请考虑拆分此问题。 -
如果您的代码抛出 Exception("...") 类型的异常,您期望 std::exception::what() 返回什么?我认为它不会包含任何有用的东西(如果它包含任何东西)。我建议简单地返回 message.c_str()。
-
return what.c_str() 语句将成为一个问题,因为 'what' 将超出范围并被破坏。你将返回一个错误的指针。
-
@Kos: std::exception::what() 是 虚拟的。至少它在 VC++ 中。