引发异常后无法退出方法

时间:2019-04-13 02:58:56

标签: c++ exception throw

被警告,我不太了解throw是如何工作的。现在,我有一个方法可以检查一个变量是否大于或等于另一个变量,如果不是,则抛出字符串异常。

问题是我不知道抛出异常后如何退出该方法,而不会出现未处理的异常错误。

CircleSquare Square::operator+ (const Circle& op2)
{
    /// Variables
    CircleSquare ret;

    /// Sets the temporary Square object's characteristics to LHS's colour, the sum of LHS sideLength + RHS sideLength, and Square name
    ret.SetName((char *)"Square-Circle");
    ret.SetColour((char *)this->GetColour());

    if (sideLength >= (op2.GetRadius() * 2))
    {
        ret.SetSideLength(sideLength);
    }
    else
    {
        throw ("The sideLength of square is smaller than the diameter of the contained circle.");
        return ret; // <--- Here is where the error occurs
    }

    if ((op2.GetRadius() * 2) <= sideLength && op2.GetRadius() >= 0.0)
    {
        ret.SetRadius(op2.GetRadius());
    }
    else
    {
        throw ("The radius of contained circle is larger than the sideLength of the square.");
        return ret;
    }

    return ret;
}

我想要做的是抛出异常,然后退出该方法并在try-catch块中处理该异常,但是相反,它在{{1处带有“未处理的异常” }}

如何退出该方法而又不会出现错误?

1 个答案:

答案 0 :(得分:0)

您需要catch throw在做什么。此外,return时,throw语句永远不会发生。 (您应删除以下行:

return ret; // <--- Here is where the error occurs

您很有可能会看到关于此的编译器警告(那是永远不会执行的代码)。您的代码应毫无警告地进行编译。总是。 (-Werror编译标志对此非常有用。)

throw的意思是:返回但不是正常方式

您需要执行以下操作:

try {
    Square a;
    Circle b;
    CircleSquare sum= a + b; // You try to sum
    // If you can, the return statement will give a value to sum
    // If you throw, sum will not get constructed, 
    // b and a will be destroyed and the catch 
    // will be executed instead of anything below
    // the call to operator+
    std::cout << "Sum is: " << sum << std::endl;
} catch (std::string s) {
    // Will only catch exceptions of type std::string
    std::cerr << "Error: " << s << std::endl;
}

如果您对goto块执行了catch,但是却清理了所有内容,这就像“喜欢”。

如果不处理它,它将仍然异常终止每个函数,直到找到正确类型的catch块或退出main