1

次のような関数で例外を 1 つ作成しました。

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 に関する別の例外をスローし、メイン プログラムの最後でそれらすべてをキャッチします。

4

3 に答える 3

2

C++ では、2 つの例外を同時に「実行中」にすることはできません。その状態が発生した場合 (たとえば、スタックの巻き戻し中にデストラクタがスローした場合)、プログラムは終了します (2 番目の例外をキャッチする方法はありません)。

できることは、適切な例外クラスを作成し、それをスローすることです。例えば:

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 から派生したクラス (または、お気に入りのライブラリの例外クラス、うまくいけばそこから派生しますが、派生しない可能性があります) のみをスローする必要があります。

于 2013-10-17T13:45:53.233 に答える
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)
{
}

注: いずれにせよ、関数からスローできる例外は 1 つだけです...

于 2013-10-17T13:51:34.733 に答える
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)
{

}
于 2013-10-17T13:48:55.633 に答える