Перехват исключений по ссылке

В этом руководстве по C ++ , в разделе «Стандартные исключения» есть этот пример кода, который использует класс, производный от стандартного класса исключений в STL:

// standard exceptions
#include 
#include 
using namespace std;

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
} myex; //Declares an instance of myexception outside of the main function

int main () {
  try
  {
    throw myex;
  }
  catch (exception& e) //My question is regarding this line of code
  {
    cout << e.what() << endl;
  }
  return 0;
}

Этот код распечатывает Мое исключение произошло . Однако, если я удалю амперсанд, он распечатает std :: exception , что происходит, когда вы вызываете what () со стандартным классом исключений, а не с производным классом.

На веб-сайте дается следующее объяснение:

Мы разместили обработчик, который перехватывает объекты исключений по ссылке (обратите внимание на амперсанд & после типа), поэтому он также перехватывает классы , производные от исключение, как и наш объект myex класса myexception.

Выбрасывание myex похоже на «вызов функции catch и передачу myex в качестве параметра»? Поскольку в этом случае я мог бы представить, что не имеет значения, генерируете ли вы исключение по значению или по ссылке (это то, что амперсанд делает правильно?), Потому что вы по-прежнему генерируете myexception , а не исключение . И из-за динамического связывания и полиморфизма или чего-то подобного, e.what () все равно должен распечатать Мое исключение произошло , а не std :: exception .

7
задан razlebe 2 December 2011 в 01:01
поделиться