【问题标题】:My exception is not caught when compiling with Qt Creator使用 Qt Creator 编译时未捕获我的异常
【发布时间】:2023-03-29 17:17:01
【问题描述】:

我已经编写了一个简单的基于控制台的网络服务器,我正在尝试将它移植到 Qt,这样我就可以为它开发一个 GUI。 在我控制从硬盘读取文件的课程中,我一直在使用异常来指示何时出现读取文件等错误。

现在,当我尝试运行使用 Qt 5.7 编译的代码时,我的 catch-block 不会突然发现我的异常。相反,它会一直把它扔回去并崩溃。 但是当我编写 catch(...) 来获取所有类型的异常时,它可以正常工作而不会崩溃..

这是我的文件读取函数中的代码:

   fstream file;
   file.exceptions( ifstream::failbit | ifstream::badbit );

    try{
        string content;
        //Open file and read the file to string
        file.open(this->getDirectory() + filename, ios_base::in|ios_base::binary);
        file.seekg(0, file.beg);
        char tmpChar = 0;
        while( file.peek() != EOF )
        {
            file.read(&tmpChar, sizeof(tmpChar));
            content.push_back(tmpChar);
        }
        file.close();

        unique_ptr<fileObject> tmpPtr( new fileObject(filename, content, "text/html") );

        if( this->addFileToCache(move(tmpPtr) ))
            return true;

        return false;
    }
    catch(const ios_base::failure& e){
        if(file.is_open()) file.close();
        return false;
    }

为什么这不适用于 Qt? catch(...) 获取 ios_base::failure 异常,所以我不明白为什么我的代码不再工作了..

更新:

当我使用 catch(exception &e) 获取异常并打印其信息时,我得到以下结果: .what() 返回 "basic_ios::clear" 并且 typeid(e).name() 返回 "NSt8ios_base7failureE" .

我在 QtCreator 中使用 MinGw 5.3.0 32 位进行编译,当我的异常工作时使用的编译器是 MinGw-w64 4.7.3。

【问题讨论】:

  • 请展示完整的代码示例
  • @nos 你有一个完整的代码示例
  • 你怎么知道catch(...) 准确捕获了ios_base::failure 异常而不是任何其他异常?
  • 当我打印字符串 typeid(e).name() 我得到: NSt8ios_base7failureE 和 e.what(): basic_ios::clear 它恰好发生在我排除 ios_base::failure 异常时被抛出..我还没有在 Qt 库中使用信号和插槽等。Qt 可以接收我的异常并重新抛出它或类似的东西吗?
  • 没有“用 Qt Creator 编译”这样的东西。 Qt Creator 是一个 IDE,而不是编译器。

标签: c++ qt exception-handling qt-creator


【解决方案1】:

问题似乎是 gcc >= 5.0 附带的 libstdc++ 的 bug:标准库的某些部分使用 C++98 ABI 抛出异常,而捕获代码使用 C++11 ABI。该错误仍未修复,除了降级编译器和标准库或不将异常与 iostream 一起使用之外,似乎没有简单的解决方法。

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多