我有一些这样的代码:
class ParseError: public exception {
protected:
mutable string msg;
int position;
public:
explicit ParseError(const string& message, const int index) {
msg = message;
position = index;
}
virtual ~ParseError() throw () {
}
const char * what() const throw () {
stringstream ss(msg);
ss << "Parse error at position " << position << ": " << msg;
msg = ss.str();
return msg.c_str();
}
};
当我抛出它时,在 valgrind 下运行单元测试时会看到类似这样的内容:
foo.h:102:带有消息的意外异常:'第 9 位解析错误:发现意外字符:blah'
这就是我想要的,但我很好奇基exception
类在幕后做了什么。如果我不扩展exception
但保持课程的其余部分不变,我会得到:
foo.h:102:带有消息的意外异常:“未知异常”
我需要向我的班级添加什么才能无法扩展exception
并仍然显示消息?
顺便说一句,我意识到我可能应该扩展runtime_error
而不是exception
. 在这种情况下,我很好奇exception
幕后的原因是什么,我不一定要寻求有关最佳实践的建议。