c++ - 基类未捕获 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 与他们的类型相同?有没有办法来解决这个问题?因为那个库抛出了很多不同的异常类型,我不能真正单独捕获每一个。
解决方案
该死的,对不起。事实证明,我使用的构建系统将 _HAS_EXCEPTIONS=0 添加到了预处理器定义中。这就是造成这种情况的原因。
推荐阅读
- python - Python 在带有 __init__.py 的文件夹中找不到我的自定义模块
- r - Rstudio system2() 命令被发送到错误的终端
- python - 在 HTML 页面中设置 JSONField
- json - Powershell 将 txt 文件的列转换为 JSON 格式
- python - 读取文件并将文件的二进制文件写入文本文档
- python - 错误:无效要求:'import streamlit as st'
- python - python中的引用计数
- ios - 在调试和发布时在 iOS 上的转换不一致
- linux - 如何在 Bash Linux 中使目录可写(适用于 VS Code)
- ios - 如何使用 UIKit 将具有所有子视图和布局的 UIView 渲染到 UIImage