2011-05-09 40 views
5

我有以下情況。捕捉提升序列化歸檔例外

這是一個代碼片段,經過編輯以演示該問題。

ifstream ifs("empty_file"); 
if(!ifs.is_open()) { 
    ui.display("Error: Unable to open file \"empty_file\"\n"); 
    return; 
} 

archive::text_iarchive ia(ifs); 
try { 
    ia >> some_class; 
} catch (...) { 
    ui.display("This should catch ever single exception\n"); 
} 

empty_file確實是一個完全空的文件。這應該會導致錯誤;它確實如此。問題是我無法捕獲boost引發的異常,並濫用用戶關於給我一個空的/損壞的文件加載。

相反,我得到如下:

Loading... 
terminate called after throwing an instance of 'boost::archive::archive_exception' 
    what(): invalid signature 
Aborted 

據我所知,趕上(...)應該抓住每一個例外存在。我做錯了什麼,或者是boost :: serialization在我有機會做任何事情之前僅僅捕獲它自己的異常並中止()?

如果後者是這種情況,那麼它只是我還是那個非常糟糕的設計?您的整個程序不應該從損壞的加載文件中崩潰(中止())。我能做些什麼呢?

回答

7

也許這個異常是由構造函數拋出的。嘗試try內構建您的text_iarchive對象,像這樣:

try { 
    archive::text_iarchive ia(ifs); 
    ia >> some_class; 
} catch (...) { 
    ui.display("This should catch every single exception\n"); 
} 

假設捕獲該異常,你要趕上的boost::archive::archive_exception代替...,當然。

+0

Ahem。我只是假裝我不是那麼愚蠢的...... *吹口哨*。 另外,很抱歉;但我不能將你的答案標記爲接受另外三分鐘。 編輯:是的,這是我有第一個catch語句,但正如我在問題中所說的,代碼被彎成不臃腫但仍然表現出我的問題(白癡)。 – Infiltrator 2011-05-09 17:04:53

+3

@Tim:我會假裝我從未犯過類似的錯誤。 ; v)的 – 2011-05-09 17:06:38

0

嘗試檢查鏈接選項。

我有類似的問題,catch(...)失敗,在write_ini()boost::property_tree的例外。我通過刪除-static-libgcc或與-static-libstdc++一起使用它來修復它。