Обработка исключений конструктором

Это был вопрос для меня.

Удивительно, но я никогда не думал об этом вопросе.

У нас есть обработка исключений внутри конструктора С++?

в напряжении и не много думая, я сказал: "Да, мы могли бы, вероятно, сделать это в конструкторе. Мы говорим, что мы выделяем некоторую память, используя новый оператор, для элемента-указателя, и это порождает исключение плохого исключения, таким образом, существует возможность исключения исключений"

Затем я подумал, что конструкторы никогда не смогут вернуть значение. Так как может быть исключение внутри конструктора. Теперь я спрашиваю об этом сам!

Может ли кто-нибудь помочь мне выйти из этой путаницы?

Ответы

Ответ 1

См. этот вопрос GOTW Constructor Failures, который немного затрагивает ваш запрос и продолжает говорить, что это пустая трата времени.

Ответ 2

Конструкторы не имеют типа возврата, поэтому невозможно использовать возврат коды. Лучший способ сигнала отказ конструктора, следовательно, выбросить исключение. Если у вас нет возможность использования исключений, "наименее плохая" работа - это объект в состояние "зомби" установка внутреннего бита состояния, чтобы объект действует как мертвый хотя это технически все еще жив.

Вы поймаете исключение в вызывающем коде, а не внутри конструктора.

См. Как я могу обработать конструктор, который не удается? для получения дополнительной информации (на самом деле, я бы предложил прочитать всю страницу об обработке исключений, действительно просвещать).

Ответ 3

Обработка исключений и тип возврата совершенно разные. когда программа находит исключение в конструкторе, он выдает исключение почти блоком catch [если используется] или передается вызывающему (main()). в этом случае у нас есть блок catch в конструкторе и исключение, обрабатываемое им. После обработки исключений будет запущен оставшийся оператор в конструкторе/функции. см. приведенный ниже пример,

class A
{
  public:
   A(){
        printf("Hi Constructor of A\n");        
   try
   {
        throw 10;
   }
   catch(...)
   {
       printf("the String is unexpected one in constructor\n");
   }
   printf("Hi Constructor of A\n");
 }
   ~A(){
   printf("Hi destructor of A\n");
 }
};

int main()
{

try{
    A obj ;
   throw "Bad allocation";
}
catch(int i)
{
    printf("the Exception if Integer is = %d\n", i);
}
 catch(double i)
{
    printf("the Exception if double is = %f\n", i);
}
 catch(A *objE)
{
    printf("the Exception if Object \n");
}
 catch(...)
{
    printf("the Exception if character/string \n");
}
printf("Code ends\n");
return 0;
}

Результат:

 Start: Constructor of A
 the String is unexpected one in constructor
 End: Constructor of A
 Hi destructor of A
 the Exception if character/string 
 Code ends

Ответ 4

С++ имеет предложения try-catch, аналогичные предложениям других языков. Учебник можно найти в Интернете: http://www.cplusplus.com/doc/tutorial/exceptions/

EDIT: пример превращен в полностью рабочий код

#include <iostream>
using namespace std;

class A
{
public:
  void f(){
    throw 10;
  }

  A(){
    try{
      f();
    }
    catch(int e){
      cout << "Exception caught\n";
    }
  }
};

int main (int argc, const char * argv[])
{

  A a;
  return 0;
}

Это производит вывод:

Exception caught