gpt4 book ai didi

c++ - 抛出异常

转载 作者:行者123 更新时间:2023-11-30 04:13:23 25 4
gpt4 key购买 nike

我在这样的函数中创建了一个异常:

void testing(int &X)
{
....
X=...
if (X>5)
throw "X greater than 5!"
}

然后在 main.cpp 中

try
{
int X=0;
testing(X);
}

catch (const char *msgX)
{
....
}

但现在我想把 Y 也介绍为 X。测试的原型(prototype)将是:

void testing(int &X, int &Y)

我的问题是,我如何抛出两个异常,如果 X>5,我抛出一个关于 X 的异常,如果 Y>10,我抛出另一个关于 Y 的异常,我在主程序的最后捕获它们?

最佳答案

在 C++ 中,不可能同时有两个“正在运行”的异常。如果出现这种情况(例如,在堆栈展开期间由析构函数抛出),程序将终止(无法捕获第二个异常)。

您可以做的是创建一个合适的异常类,然后将其抛出。例如:

class my_exception : public std::exception {
public:
my_exception() : x(0), y(0) {} // assumes 0 is never a bad value
void set_bad_x(int value) { x = value; }
void set_bad_y(int value) { y = value; }
virtual const char* what() {
text.clear();
text << "error:";
if (x)
text << " bad x=" << x;
if (y)
text << " bad y=" << y;
return text.str().c_str();
}
private:
int x;
int y;
std::ostringstream text; // ok, this is not nothrow, sue me
};

然后:

void testing(int &X, int &Y)
{
// ....
if (X>5 || Y>10) {
my_exception ex;
if (X>5)
ex.set_bad_x(X);
if (Y>10)
ex.set_bad_y(Y);
throw ex;
}
}

无论如何,你永远不应该抛出原始字符串或整数或类似的东西——只抛出从 std::exception 派生的类(或者可能是你最喜欢的库的异常类,它们希望从那里派生,但可能不是)。

关于c++ - 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19428238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com