C++ 异常在构造函数try块中被捕获并处理,但仍会再次被重试

C++ 异常在构造函数try块中被捕获并处理,但仍会再次被重试,c++,inheritance,exception,try-catch,C++,Inheritance,Exception,Try Catch,在处理继承时,我试图更好地理解抛出-捕获机制 我试图解决的问题是,如果在构造派生类时,首先构造的基类抛出异常,将会发生什么情况 #包括 #包括 阶级基础 { 公众: Base() { 抛出std::运行时_错误(“测试”); } }; 派生类:公共基 { 公众: 派生()try:Base() { } 捕获(标准::运行时错误&e) { STD::CUT> P>这是一个基本的C++核心原则:只有在对象的构造函数返回之后,对象才被完全构造。当执行进入类的构造函数时,类本身是“强>不< /强”。只构造

在处理继承时,我试图更好地理解抛出-捕获机制

我试图解决的问题是,如果在构造派生类时,首先构造的基类抛出异常,将会发生什么情况

#包括
#包括
阶级基础
{
公众:
Base()
{
抛出std::运行时_错误(“测试”);
}
};
派生类:公共基
{
公众:
派生()try:Base()
{
}
捕获(标准::运行时错误&e)
{

STD::CUT> P>这是一个基本的C++核心原则:只有在对象的构造函数返回之后,对象才被完全构造。当执行进入类的构造函数时,类本身是“强>不< /强”。只构造它的类成员(以及任何基类)。。只有当构造函数返回时,才然后对象被完全构造,并且您有一个完全煮熟的对象可玩

因此,构造函数中抛出的异常意味着对象是而不是构造的。句号。故事结束。这就是她写的。这个规则没有异常(双关语)

现在,当您捕获从基类的构造函数抛出的异常时,这意味着什么?您可以这样做,但这不会改变引发异常而基类未被构造的事实。这意味着无法构造派生类。您不能期望执行到达end异常处理程序,然后返回父级,就好像类已完全构造且没有错误一样

这不仅仅是要发生的,你不能,不知怎么地,最终的基类不是被构造,而是派生类被构造。C++不这样工作。< /P> 从基类捕获异常时,只有两个选项:

1) 您的异常处理程序可以在执行它想执行的任何操作之后重新抛出它自己的异常


< p > 2)否则,C++将为您抛出异常,如果异常处理程序返回而不抛出自己的异常。

< P>是的,这是正确的行为。您有一个尝试/ catch块,它捕获基类和初始化列表中的异常。根据标准,此异常将自动从“代码> CA中重新抛出。tch
block。如果您在析构函数中捕获异常,并尝试/捕获析构函数的主体,则情况也是如此。

感谢您提供了详细的答案,在阅读您的答案后,我在谷歌上搜索了一些内容,并提供了大量附加信息。没有“使用不同参数重试”选项。如果需要,请创建一个帮助器函数,该函数返回基类的实例。该帮助器可以进行内部故障处理。然后,将返回的对象传递给基类的move-ctor。这不应引发。