抛出异常

时间:2013-10-17 13:35:07

标签: c++ visual-studio-2010 exception

我在像这样的函数中创建了一个例外:

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的异常,我在主程序的末尾捕获它们?

3 个答案:

答案 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)
{
}

注意:在任何情况下,您只能从函数中抛出一个例外...