2014-10-10 131 views
2

我試圖捕獲由boost::property_tree::xml_parser::read_xml引發的異常。這裏是我的示例程序:在boost :: property_tree :: read_xml中捕獲異常

#include <iostream> 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 
int main(int argc, char** argv){ 
     boost::property_tree::ptree pt; 
     std::cout<<"123123"<<std::endl; 
     try{ 
     std::cout<<"Reading "<<argv[1]<<std::endl; 
     read_xml(argv[1], pt); 
     } 
     catch(const boost::property_tree::xml_parser::xml_parser_error& ex){ 
     std::cout<<argv[1]<<" failed, reading "<<argv[2]<<std::endl; 
     read_xml(argv[2], pt); 
     } 
} 

輸出是:

123123 
Reading 123.xml 
[1] 97028 abort  ./a.out 123.xml 345.xml 

我在做什麼錯?顯然這個例外沒有被捕獲。我也嘗試通過(...)抓住每一件事,並抓住std::exception以及boost::exception。在所有情況下,結果都是一樣的。根據boost文檔,應該拋出一個xml_parser_error。我的升級版本是1.54。

一個小更新: 當我不嘗試只是執行read_xml( 「notAValidFilePAth」,PT),然後我得到

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::property_tree::xml_parser::xml_parser_error> >' 
    what(): 123.xml: cannot open file 

當我用gdb運行它,我得到:

Reading terminate called after throwing an instance of 
'boost::exception_detail::clone_impl< 
     boost::exception_detail::error_info_injector< 
      boost::property_tree::xml_parser::xml_parser_error> >' 
    what(): PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/MacGPG2/bin:/opt/local/bin:/usr/texbin:/Users/weidenka/bin: 
cannot open file 
Program received signal SIGABRT, Aborted. 
    0x00007fff8a31b866 in __pthread_kill() 

#0 0x00007fff8a31b866 in __pthread_kill() 
#1 0x00007fff86c9f35c in pthread_kill() 
#2 0x00007fff86240b1a in abort() 
#3 0x00000001005547d5 in __gnu_cxx::__verbose_terminate_handler() 

在此先感謝!

最良好的祝願,彼得

+1

這看起來像是崩潰而不是異常。使用調試器並向我們顯示堆棧跟蹤。 – 2014-10-10 13:30:26

+0

如果它崩潰,看起來像庫中的一個bug(禁止任何錯誤的構建w.r.t.庫兼容性) – sehe 2014-10-10 14:01:01

回答

0

這是你的問題:

read_xml(argv[2], pt); 

讀操作不反對拋出異常森嚴的回落,所以在發生異常時,在這一點上你的程序終止,而不刷新iostreams緩衝區。