1

我开始使用异常并更精确地处理一些事件或错误,我创建了自己的异常类型,它从std::exception. 到目前为止一切顺利,但我刚刚注意到有时该方法what()不会打印任何内容。异常被很好地抛出和捕获,但该方法正常打印的解释消息what()并不总是显示在屏幕上。它可能发生在与之前结束打印消息的执行相同的参数下,并且似乎是完全随机的。

这是我的例外:

class MyException : public std::exception
{
    public:
        MyException() throw() {}
        ~MyException() throw() {}
        virtual const char *what() const throw()
        {
            return "general exception\n";
        }
};

class FileError : public MyException
{
    public:
        FileError(std::string nFileName) : MyException(), fileName(nFileName) { }
        ~FileError() throw (){ }
        virtual const char *what()
        {
            std::ostringstream oss;
            oss << "Error with file : \"" << fileName << "\"." << std::endl;
            return (oss.str()).c_str();
        }
    protected:
        std::string fileName; 
};

以及引起我问题的上下文:

try
{
    QFile sourceFile(sourceFileName);
    if(!sourceFile.open(QIODevice::ReadOnly))
        throw FileError(sourceFileName.toStdString());
    sourceFile.close();
}
catch(FileError &e)
{
    std::cout << "error file catch " << std::endl;
    std::cout << e.what();
    terminate();
}

“错误文件捕获”总是打印,但有时“文件错误......”。知道我做错了什么吗?谢谢

4

2 回答 2

4

您正在返回一个指向临时 std::string 内容的指针。

于 2012-09-24T18:44:14.260 回答
2

std::cout在调用之前没有冲洗terminate(假设是std::terminate)。我建议std::endl在它的输出点使用(这是一个换行符和一个刷新),而不是在里面FileError::what()

catch(FileError &e)
{
    std::cout << "error file catch " << std::endl;
    std::cout << e.what() << std::endl;
    terminate();
}

此外,正如@Yuri Kilocheck 所指出的,您正在返回一个指向临时字符串的指针,调用UB。通常的解决方案是在执行时构建一个字符串成员what()(如果构建字符串失败,则返回一些预定义的版本)。

于 2012-09-24T18:40:58.577 回答