2016-09-26 2 views
7

Вот часть кода, о котором я говорю.clang try catch fail

try { 
     std::cerr << "first try" << std::endl; 
     po::store(po::parse_config_file(ifs, _configFileOptions, false), vm); 

} catch(...) {   
     std::cerr << "second try" << std::endl;    
} 

Для поиска деталей я использую boost program_options для анализа файла конфигурации. Исключение вызывает повышение, поскольку я помещаю опцию в непризнанный файл.

Существует проблема с тем, что Clang не перехватывает это исключение. В основном я вижу только в выходе

first try 
libc++abi.dylib: terminating with uncaught exception of type boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::unknown_option> >: unrecognised option 'TestFrequency' 
Abort trap: 6 

Вот моя версия лязг:

c++ --version 
Apple LLVM version 7.3.0 (clang-703.0.31) 
Target: x86_64-apple-darwin15.6.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 

EDIT: Когда не является исключением, синтаксический и все работает отлично.

+2

Какая версия повышения у вас есть? Может быть, вам лучше повезти с помощью catch (std :: exception &) – Trevir

+0

boost 1.55. Все скомпилировано с помощью Clang против libC++. и да, я попробовал catch (std :: exception &), прежде чем отправлять вопрос, но он не работал. –

+1

Это обычное явление, когда boost и exe скомпилированы против разных стандартных библиотек (я знаю, что вы упомянули об этом, но еще раз проверьте). –

ответ

0

Это может быть связано с выпуском RTTI (информация о времени выполнения), аналогичным this issue with GoogleMaps или this question on SO.

Убедитесь, что Boost и ваш код скомпилированы без fno-rtti.