2016-10-30 43 views
0

我已經寫了一個簡單的基於控制檯的web服務器,我試圖移植到Qt,所以我可以爲它開發一個GUI。 在我的課上,控制從硬盤讀取文件我一直在使用例外來指示讀取文件時出現錯誤等。使用Qt Creator編譯時,我的異常沒有被捕獲

現在,當我嘗試運行使用Qt 5.7編譯的代碼時,我的catch-block突然間我的異常並沒有出現。相反,它會一直拋出並崩潰。 但是,當我寫趕上(...)拿起各類它的工作原理沒有崩潰的異常..

這是我filereading函數的代碼:

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?趕上(...)拿起的ios_base ::失敗例外,所以我不明白爲什麼我的代碼不工作了..

UPDATE:

當我拿起例外使用catch(例外& e)並打印它的信息我得到以下結果:.what()返回「basic_ios :: clear」,typeid(e).name()返回「NSt8ios_base7failureE」。

我正在用QtCreator中的MinGw 5.3.0 32位編譯,以及我的異常工作時使用的編譯器是MinGw-w64 4.7.3。

+0

請顯示完整的代碼示例 – nos

+0

@nos您有一個完整的代碼示例 – hallos

+0

您如何知道'catch(...)'恰恰捕獲了'ios_base :: failure'異常而沒有任何其他異常? – Dmitry

回答

0

問題似乎是隨gcc> = 5.0提供的libstdC++的bug:標準庫的某些部分使用C++ 98 ABI引發異常,而捕獲代碼使用C++ 11 ABI。該錯誤仍然沒有解決,除了降級編譯器和標準庫,或者沒有將異常與iostream一起使用,似乎沒有簡單的解決方法。