обработка исключений в конструкторе - PullRequest
14 голосов
/ 21 апреля 2011

Это был вопрос моего интервью.

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

можем ли мы обработать исключение внутри конструктора c ++?

в напряжении и не особо задумываясь, я сказал: «да, мы могли бы, вероятно, сделать это в конструкторе."

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

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

Ответы [ 4 ]

12 голосов
/ 21 апреля 2011

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

2 голосов
/ 21 апреля 2011

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

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

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

0 голосов
/ 04 февраля 2016

Обработка исключений и тип возврата совершенно разные.когда программа находит исключение в конструкторе, она генерирует исключение почти в блоке 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
0 голосов
/ 21 апреля 2011

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

РЕДАКТИРОВАТЬ: пример превратился в полностью рабочий код

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...