在 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 派生的类(或者你最喜欢的库的异常类,希望从那里派生,但可能不会)。