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