В этом учебном пособии по C ++ , в разделе, озаглавленном «Стандартные исключения», есть этот пример кода, который использует класс, производный от стандартного класса исключений в STL:
// standard exceptions
#include <iostream>
#include <exception>
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;
}
Этот код распечатывает My exception happened
.Однако, если я удалю амперсанд, он напечатает std::exception
, что и происходит, когда вы вызываете what()
со стандартным классом исключений, а не с производным классом.
Веб-сайт дает такое объяснение:
Мы поместили обработчик, который перехватывает объекты исключений по ссылке (обратите внимание на амперсанд и после типа), поэтому он также отлавливает классы, полученные из исключения, как наш объект myex класса myexception.
Является ли бросание myex
чем-то вроде "вызова функции catch
и передачи myex
в качестве параметра"?Потому что в этом случае я бы подумал, что не имеет значения, выбрасываете ли вы исключение по значению или по ссылке (это то, что амперсанд делает правильно?), Потому что вы все равно выбрасываете myexception
, а не exception
.А из-за динамического связывания и полиморфизма или чего-то в этом роде e.what()
все равно должен печатать My exception happened
, а не std::exception
.