【发布时间】:2014-09-10 05:24:58
【问题描述】:
我是 C++ 新手,我正在尝试创建一个自定义异常,该异常在其 ctor 中接收一条消息。
我现在拥有的是这样的:
class LevelLoadException : public std::exception
{
public:
LevelLoadException(std::string msg) : m_message(msg) { }
const char * what () const throw ()
{
return m_message.c_str();
}
private:
std::string m_message;
};
在我的调用代码中,我将此作为 switch 语句的一部分(c 是一个字符,或者更具体地说,c = line[x]; 其中x 是一个int 和line 是一个std::string );
default:
throw LevelLoadException("Invalid Character in Level: " + c);
问题是我的异常得到了一个完全不相关的字符串(这是抛出的同一方法的一部分:throw std::exception("There is more than 1 player start in the level."))。
我已经排除了一个逻辑错误——我的程序到达了抛出带有正确字符串的正确异常的行。所以我很确定这是一个生命周期/内存管理问题。
据我了解,C++ 默认是按值复制的。所以我认为调用LevelLoadException 的ctor 会立即复制字符串。但似乎有一些指针的东西正在发生,因为我正在构建的字符串看起来像一个 C 字符串 (const char*)。
我查看了 std::exception 类,它以 const char* const& 作为消息,然后在后台执行了一些类似 C 的 strcopy/malloc(MSVC / Visual Studio 2012 Update 4)。
我不是百分百确定我真正需要什么。我想我想要的是一个内置在调用者中的字符串,然后移动/复制到异常中(它现在拥有仅由异常拥有的字符串的副本),然后调用者中的那个在它退出时被销毁范围。
谁能给我a pointer 我应该做些什么不同的事情才能正确地做到这一点?
【问题讨论】:
-
你发现了一个标准异常?
-
@Christophe 不,我在消费者中有
catch(LevelLoadException& e)。 -
您应该派生自
std::runtime_error而不是std::exception。然后你的班级可以减少到couple of lines。 -
如果你决定不走
std::runtime_error路线,你应该考虑做按需格式化,因为在创建那些std::strings的过程中分配错误会导致麻烦。