Поймать с несколькими параметрами - PullRequest
3 голосов
/ 24 октября 2010

Сначала я нашел в cplusplus.com следующую цитату:

Формат перехвата похож на обычную функцию, которая всегда имеет хотя бы один параметр.

Но я попробовал это:

try
{
    int kk3,k4;
    kk3=3;
    k4=2;
    throw (kk3,"hello");
}
catch (int param)
{
    cout << "int exception"<<param<<endl;     
}
catch (int param,string s)
{
    cout<<param<<s;
}
catch (char param)
{
    cout << "char exception";
}
catch (...)
{
    cout << "default exception";
}

Компилятор не жалуется на бросок с фигурными скобками и несколькими аргументами.Но на самом деле он жалуется на улов с несколькими параметрами, несмотря на то, что говорится в ссылке.Я не совсем понимаю.try и catch допускает эту множественность или нет?А что, если бы я хотел создать исключение, включающее более одной переменной с одним типом или без него.

Ответы [ 2 ]

10 голосов
/ 24 октября 2010

(kk3, "hello") - это запятое выражение.Выражение запятой оценивает все свои аргументы слева для записи, и результат является самым правым аргументом.Так что в выражении

int i = (1,3,4); 

я становлюсь 4.

Если вы действительно хотите бросить их обоих (по некоторым причинам), вы можете бросить так

 throw std::make_pair(kk3, std::string("hello")); 

и поймать так:

catch(std::pair<int, std::string>& exc)
{
}

И предложение catch имеет ровно один аргумент или

...

HTH

2 голосов
/ 24 октября 2010

В дополнение к другим ответам, я бы порекомендовал вам создать свой собственный класс исключений, который может содержать более одной части информации. Это должно предпочтительно происходить из std::exception. Если вы сделаете это стратегией, вы всегда можете поймать свои исключения одним catch(std::exception&) (полезно, если вы хотите только освободить некоторый ресурс, а затем выбросить исключение - вам не нужно иметь обработчики gazilion для каждого каждый тип исключения, который вы выбрасываете).

Пример:

class MyException : public std::exception {
   int x;
   const char* y;

public:
   MyException(const char* msg, int x_, const char* y_) 
      : std::exception(msg)
      , x(x_)
      , y(y_) {
   }

   int GetX() const { return x; }
   const char* GetY() const { return y; }
};

...

try {
   throw MyException("Shit just hit the fan...", 1234, "Informational string");
} catch(MyException& ex) {
   LogAndShowMessage(ex.what());
   DoSomething(ex.GetX(), ex.GetY());
}
...