Я компилирую следующий код с Visual C ++ 2017 (функции C ++ 17 включены)
int main() {
try {
// loot is some library that is linked as a dll
auto game = loot::CreateGameHandle(loot::GameType::fonv, "c:\\something\\invalid", "C:\\something\\invalid");
// throw std::invalid_argument("this works as expected");
}
catch (const std::exception &e) {
std::cout << "caught as exception " << e.what() << std::endl;
}
catch (const std::invalid_argument &e) {
std::cout << "caught as invalid_argument " << e.what() << std::endl;
}
catch (...) {
std::cout << "caught by ..." << std::endl;
}
}
Компилятор сообщает, как и ожидалось:
warning C4286: 'const std::invalid_argument &': is caught by base class ('const stdext::exception &') on line 8
Однако,вывод приложения
caught as invalid_argument Given game path "c:\something\invalid" does not resolve to a valid directory.
И это не просто изменение порядка перехвата или чего-то другого. Если я удаляю последние 2 блока перехвата, приложение вылетает из-за необработанного исключения.
Какчто вообще возможно?Я предполагаю, что это как-то связано с настройками компилятора, из-за которых my std :: exception отличается от типа std :: invalid_argument внутри библиотеки, наследуемого от - но почему тогда my std :: invalid_argument того же типа, что и их?Есть ли способ это исправить?Потому что эта библиотека генерирует много разных типов исключений, и я не могу поймать каждый из них по отдельности.