Исключение C ++, не пойманное базовым классом - PullRequest
0 голосов
/ 24 января 2019

Я компилирую следующий код с 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 того же типа, что и их?Есть ли способ это исправить?Потому что эта библиотека генерирует много разных типов исключений, и я не могу поймать каждый из них по отдельности.

1 Ответ

0 голосов
/ 24 января 2019

Черт возьми, прости за это.Оказывается, система сборки, которую я использовал, добавила _HAS_EXCEPTIONS = 0 к определениям препроцессора.Вот что вызывает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...