gpt4 book ai didi

c++ - 如何使用消息正确创建自定义异常?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:08 28 4
gpt4 key购买 nike

我是 C++ 的新手,我正在尝试创建一个在其构造函数中接收消息的自定义异常。

我现在拥有的是:

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 是一个 intline 是一个 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 的构造函数会立即复制字符串。但似乎有一些指针在发生,因为我正在构建的字符串看起来像 C 字符串 (const char*)。

我查看了 std::exception 类,它采用 const char* const& 作为消息,然后在引擎盖(MSVC/Visual Studio 2012 Update 4)。

我不能百分百确定我真正需要什么。我想我想要的是一个在调用者中构建的字符串,然后移动/复制到异常中(它现在拥有仅由异常拥有的字符串的拷贝)然后调用者中的那个在它退出时被销毁范围。

谁能给我a pointer我应该做些什么来正确地做到这一点?

最佳答案

"Invalid Character in Level: "+ c 并没有按照您的想法去做。它的意思是“一个char*指针,从字符串文字的开头偏移N字节”,其中N是ASCII码存储在 c 中的字符。文字实际上比 N 个字符短的可能性很高,在这种情况下,该程序包含缓冲区溢出并表现出未定义的行为。

成功

throw LevelLoadException(std::string("Invalid Character in Level: ") + c);

关于c++ - 如何使用消息正确创建自定义异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25757875/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com