【发布时间】: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