关于类似问题的问题很少,但是大多数问题都是在函数声明之后删除了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。
答案 0 :(得分:0)
我再次做了一些“评论”研究和测试。结果非常令人尴尬因为我已经陷入了自己的懒惰中。时间陷阱。我设法发现SFML对象导致了麻烦,因此是时候检查所有项目和C :: B设置了。清除它们之后(删除配置文件等等)它开始工作(“魔术”)所以在调查了clear和我的旧配置文件之后我发现了真正的麻烦制造者 - 链接器设置:
-static -static-libgcc -static-libstdc ++
因为我已经将SFML编译为动态版本......发生了明显的冲突。
很抱歉浪费你的时间并感谢你的所有提示。