首页 > 解决方案 > 基类未捕获 C++ 异常

问题描述

我正在使用 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 个捕获块,应用程序会因为未处理的异常而崩溃。

这怎么可能呢?我假设这在某种程度上与编译器设置有关,这些设置使我的std::exception 与库中的一个 std::invalid_argument 继承自不同的类型 - 但为什么我的std::invalid_argument 与他们的类型相同?有没有办法来解决这个问题?因为那个库抛出了很多不同的异常类型,我不能真正单独捕获每一个。

标签: c++exception-handling

解决方案


该死的,对不起。事实证明,我使用的构建系统将 _HAS_EXCEPTIONS=0 添加到了预处理器定义中。这就是造成这种情况的原因。


推荐阅读