Можем ли мы повторно выбросить исключение с помощью конструктора, если да, то почему? - PullRequest
0 голосов
/ 12 июля 2020
class A
{
    int a,b;
  public:
    A(int X,int Y)
    {
        X = a;
        Y = b;
        try
        {
            if (b == 0)
                throw b;
            else
                cout << a / b;
        }
        catch (int a)
        {
            cout << a; //throw;can we rethrow??then what is purpose of it??
        }
    }
};

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

"мы можем перебросить?" - Да. Вы всегда можете повторно сгенерировать перехваченное исключение, чтобы позволить кому-то выше в стеке вызовов также обработать его (или заставить его завершить программу, если он не пойман).

0 голосов
/ 12 июля 2020

Исключение в конструкторе означает, что произошло что-то действительно плохое, и, поскольку конструкторы не могут вернуть (недопустимое) значение, указывающее на сбой в правильной конструкции объекта, есть 3 варианта: инициализировать объект в каком-то особом состоянии в надежде что где-то еще в коде вызывающего абонента он будет проверяться и обрабатываться должным образом, или для установки внешней переменной / флага, чтобы отметить сбой инициализации, или для создания исключения после освобождения любой памяти, которую он динамически выделяет. Как правило, если исключение генерируется до того, как объект полностью построен, деструкторы будут вызываться для любых объектов-членов, которые были созданы на данный момент. И если массив объектов был частично построен при возникновении исключения, будут вызываться только деструкторы для созданных объектов массива. Кроме того, деструкторы вызываются для каждого автоматического c объекта, созданного в блоке try, прежде чем будет обнаружено исключение, возникшее в этом блоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...