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

前端之家收集整理的这篇文章主要介绍了c – 如何使用消息正确创建自定义异常?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是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是char,或者更具体地说,c = line [x];其中x是int,line是std :: string);

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

问题是我的Exception获得了一个完全不相关的字符串(这是抛出相同方法的一部分:throw std :: exception(“在级别中有超过1个玩家开始.”)).

我已经排除了一个逻辑错误 – 我的程序到达了正确的字符串抛出正确异常的行.所以我很确定这是一个终身/内存管理问题.

根据我的理解,C默认是按值复制的.所以我认为调用LevelLoadException的ctor会立即复制字符串.但似乎有一些指针正在进行,因为我正在构建的字符串看起来像一个C字符串(const char *).

我查看了std :: exception类,这需要一个const char * const&作为消息,然后在引擎盖下做一些类似C的strcopy / malloc(MSVC / Visual Studio 2012 Update 4).

我不是百分之百确定我真正需要的东西.我想我想要的是一个在调用者中构建的字符串,然后移动/复制到Exception(它现在拥有只由异常拥有的字符串的副本)然后调用者中的那个被删除范围.

有人可以给我a pointer我应该做的不同做这件事吗?

解决方法

“级别中的字符无效:”c不会按照您的想法执行此操作.它表示“一个char *指针,它从字符串文字的开头偏移N个字节”,其中N是存储在c中的字符的ASCII代码.机会很高,文字实际上比N个字符短,在这种情况下,该程序包含缓冲区溢出并显示未定义的行为.

做了

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

猜你在找的C&C++相关文章