我写了一个简单的consolebased网络服务器,我试图移植到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(异常&amp; e)获取异常并打印其信息时,我得到以下结果:.what()返回“basic_ios :: clear”和typeid(e).name()返回“ NSt8ios_base7failureE”。
我正在使用QtCreator中的MinGw 5.3.0 32位进行编译,我在异常工作时使用的编译器是MinGw-w64 4.7.3。
答案 0 :(得分:0)
问题似乎是随gcc&gt; = 5.0附带的libstdc ++ bug:标准库的某些部分使用C ++ 98 ABI抛出异常,而捕获代码使用C ++ 11 ABI。该错误仍然没有修复,似乎没有简单的解决方法,除了降级编译器和标准库或不与iostreams一起使用异常。