c – 为什么被捕后我的异常仍然被抛出?

c – 为什么被捕后我的异常仍然被抛出?,第1张

概述我有以下代码,其中一个变量正在使用函数调用的结果进行初始化.这个函数抛出所以我设置了一个try-catch来捕获异常.由于某种原因,即使在catch子句运行后,异常仍会出现在屏幕上. #include <iostream>#include <stdexcept>int f() { throw std::invalid_argument("threw"); return 50; }stru 我有以下代码,其中一个变量正在使用函数调用的结果进行初始化.这个函数抛出所以我设置了一个try-catch来捕获异常.由于某种原因,即使在catch子句运行后,异常仍会出现在屏幕上.
#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 – 为什么被捕后我的异常仍然被抛出?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1236794.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存