抛出异常后无法退出方法
Cannot Exit Method after throwing Exception
请注意,我不太了解 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 块中处理异常,但相反,它在 "Unhandled Exception" return ret;
如何在不出现错误的情况下退出此方法?
您需要catch
您throw
正在做的事情。此外,当您 throw
时,return
语句永远不会发生。 (您应该删除以下行:
return ret; // <--- Here is where the error occurs
您很可能会看到编译器的一些警告(那是永远不会执行的代码)。您的代码应该可以毫无警告地编译。总是。 (-Werror
编译标志对此非常有用)。
throw
表示:return 但不是正常方式
您需要执行以下操作:
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;
}
如果您对 catch
块执行了 goto
,但清除了所有内容,则为 "like"。
如果你不处理它,它仍然会异常终止每个函数,直到它找到一个正确类型的catch
块或者直到它退出main
。
请注意,我不太了解 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 块中处理异常,但相反,它在 "Unhandled Exception" return ret;
如何在不出现错误的情况下退出此方法?
您需要catch
您throw
正在做的事情。此外,当您 throw
时,return
语句永远不会发生。 (您应该删除以下行:
return ret; // <--- Here is where the error occurs
您很可能会看到编译器的一些警告(那是永远不会执行的代码)。您的代码应该可以毫无警告地编译。总是。 (-Werror
编译标志对此非常有用)。
throw
表示:return 但不是正常方式
您需要执行以下操作:
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;
}
如果您对 catch
块执行了 goto
,但清除了所有内容,则为 "like"。
如果你不处理它,它仍然会异常终止每个函数,直到它找到一个正确类型的catch
块或者直到它退出main
。