我在像这样的函数中创建了一个例外:
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.测试的原型将是:
void testing(int &X, int &Y)
我的问题是,如何抛出两个异常,其中如果X> 5,我抛出关于X的异常,如果Y> 10,我抛出另一个关于Y的异常,我在主程序的末尾捕获它们?
答案 0 :(得分:2)
在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派生的类(或者你最喜欢的库的异常类,希望然后从那里派生,但可能不会)。
答案 1 :(得分:0)
您可以抛出不同的异常类型,也可以使用具有不同内容的相同异常类型。
struct myexception : public std::exception
{
std::string description;
myexception(std::string const & ss) : description(ss) {}
~myexception() throw () {} // Updated
const char* what() const throw() { return description.c_str(); }
};
void testing(int &X, int &Y)
{
if (X>5)
throw myexception("X greater than 5!")
if (Y>5)
throw myexception("Y greater than 5!")
}
try
{
int X=0;
testing(X);
}
catch (myexception const & ex)
{
}
答案 2 :(得分:0)
这是一幅草图:
class x_out_of_range : public std::exception {
virtual const char* what() { return "x > 5"; }
};
class y_out_of_range : public std::exception {
virtual const char* what() { return "y > 10"; }
};
现在你的功能:
if (x > 5)
throw x_out_of_range();
:
if (y > 10)
throw y_out_of_range();
现在你的捕获代码:
try
{
:
}
catch (x_out_of_range const& e)
{
}
catch (y_out_of_range const& e)
{
}
注意:在任何情况下,您只能从函数中抛出一个例外...