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

标签 c++ exception c++11

我是 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/

相关文章:

java - java中抛出异常

c++ - 如何在特定的内存位置写入数据? C++

c++ - 一个抽象类可以作为其他具体类的成员作为组合关系吗? C++

c++ - 在窗口顶部使用 Sciter 渲染 UI

c++ - 专门化命名空间中的模板——命名空间别名真的是别名吗?

java - "Too Many Results"的常规 Java 异常是什么

c++ - 在 C++ 中使用 fstream 读取和追加文件

exception - WSO2 Identity Server无法通过API添加具有多个声明值的用户

c++ - 读取小端 16 位无符号整数

c++ - emplace_back 和继承