没有抓住例外情况

时间:2014-01-04 14:08:52

标签: c++ exception-handling

关于类似问题的问题很少,但是大多数问题都是在函数声明之后删除了throw(),因此这些问题并不能解决我的问题(可能)。

我为SFML 2.1中的未来项目创建了资源管理器,因此我需要在那里进行一些错误处理。

离。我有这个方法:

sf::Music & cResourceManager::getMusic(const std::string & key) {
    if(key.empty()) throw std::invalid_argument("empty key");
    return MusicObject;
}

它似乎毫无意义,但它现在仅用于测试目的。

然后在main()中:

try {
    RESOURCE_MANAGER.getMusic("");
} catch (const std::runtime_error &ob) {
    std::cout << ob.what() << std::endl;
} catch (const std::invalid_argument &ob) {
    std::cout << ob.what() << std::endl;
} catch (...) {
    std::cout << "unknown error\n";
}

明显的结果是(是吗?)那getMusic()将抛出invalid_argument(),它应该被抓被抓(常量的std :: invalid_argument和b)或至少通过捕捉(...),但不是捕它显示&#34;空键&#34;或&#34;未知错误&#34;它只显示:

  

此应用程序已请求Runtime以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。

这种奇怪行为的原因是什么?

@edit 我正在使用code :: blocks。

1 个答案:

答案 0 :(得分:0)

我再次做了一些“评论”研究和测试。结果非常令人尴尬因为我已经陷入了自己的懒惰中。时间陷阱。我设法发现SFML对象导致了麻烦,因此是时候检查所有项目和C :: B设置了。清除它们之后(删除配置文件等等)它开始工作(“魔术”)所以在调查了clear和我的旧配置文件之后我发现了真正的麻烦制造者 - 链接器设置:

  

-static -static-libgcc -static-libstdc ++

因为我已经将SFML编译为动态版本......发生了明显的冲突。

很抱歉浪费你的时间并感谢你的所有提示。