#include <iostream>#include <stdexcept>int f() { throw std::invalID_argument("threw"); return 50; }struct S{ S() try : r(f()) { std::cout << "works"; } catch(const std::invalID_argument&) { std::cout << "fails"; } int r;};int main(){ S s;}
显示异常后,此代码打印“失败”:
06001
为什么异常仍然被抛出?我在main中设置了相同的代码,它可以正常工作:
int main(){ try { throw std::invalID_argument("blah"); } catch(const std::invalID_argument&) { }}
那么为什么它在初始化列表中使用时会失败呢?
解决方法 具有函数try块的构造函数(就像你对S所拥有的那样)会自动重新抛出catch块捕获的任何异常.因此,在捕获异常之后,它会重新抛出异常.此行为与正常的catch处理程序不同,后者不执行此 *** 作.我认为基本原理是,如果构造数据成员或基类失败,则该对象无法构造. catch处理程序的目的只是在异常向外传播之前进行任何额外的清理.希望这可以帮助!
总结以上是内存溢出为你收集整理的c – 为什么被捕后我的异常仍然被抛出?全部内容,希望文章能够帮你解决c – 为什么被捕后我的异常仍然被抛出?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)