Остановить создание экземпляра класса C++

Есть ли способ остановить класс С++, если при создании экземпляра возникла ошибка? Например, вернуть NULL, может быть? По сути, у меня есть класс-оболочка для MySQL, и конструктор выполняет соединение, но если соединение не удается, я хочу, чтобы объект был бесполезен?

PDB::PDB(string _DB_IP, string _DB_USER, string _DB_PASS, string _DB_DB)
  : _DB_IP( _DB_IP ), _DB_USER( _DB_USER ), _DB_PASS( _DB_PASS ), _DB_DB( _DB_DB )
{
  mysql_init(&this->mysql);

  this->connection = mysql_real_connect(&this->mysql, this->_DB_IP.c_str(), this->_DB_USER.c_str(), this->_DB_PASS.c_str(), this->_DB_DB.c_str(), 0, 0, 0);

  if( this->connection == NULL ) // WHAT SHOULD I DO HERE, OTHER THAN THROW AN ERROR?
    {
      cout << mysql_error(&this->mysql) << endl;
    }

  this->result = NULL;
}

Что мне делать в тесте NULL, чтобы остановить создание и т. д.?


person Josh    schedule 17.12.2010    source источник
comment
Может быть, я должен удалить соединение из конструкции? Или выдать ошибку в функции запроса, если это соединение пустое? Хмммз   -  person Josh    schedule 18.12.2010
comment
Это хороший слоган для футболки.   -  person tkerwin    schedule 18.12.2010


Ответы (2)


Генерация исключения — действительно единственный способ указать на ошибку во время построения.

http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.8

person Fred Larson    schedule 17.12.2010
comment
Нет, это не так. Например, объект std::fstream не указывает на ошибки таким образом. - person unquiet mind; 18.12.2010
comment
Потому что std::fstream не указывает на ошибки в конструкторе. - person tenfour; 18.12.2010
comment
@unquiet mind: Да, это пример техники зомби, упомянутой в статье по ссылке. Могут быть времена, когда это наименее плохая альтернатива, как говорит Маршалл Клайн, но вам придется привести довольно веский аргумент, чтобы убедить меня, что это лучше, чем бросить. - person Fred Larson; 18.12.2010
comment
@Fred Я думаю, что хорошим аргументом в пользу ФАЙЛОВЫХ ПОТОКОВ является то, что Стандартная библиотека делает это именно так, и это работает довольно хорошо. Я думаю, что с такими потоками намного проще работать, чем с теми, которые выдают исключения. - person unquiet mind; 18.12.2010
comment
@unquiet mind: на самом деле часто ошибки ввода-вывода остаются незамеченными (особенно новичками, которые не понимают, почему их код зацикливается, если ввод неправильно сформирован), потому что iostream по умолчанию не выдает никаких ошибок. - person Matteo Italia; 18.12.2010

Если соединение обычно не удается, установите флаг в объекте и предоставьте функцию-член is_connected() для класса и используйте ее в коде своего приложения. Если обычно это не может дать сбой, сгенерируйте исключение. Первый — это шаблон, который стандартная библиотека C++ использует для открытия файловых потоков.

person unquiet mind    schedule 17.12.2010
comment
Остерегайтесь объяснений с использованием терминов (без их определения), таких как обычные или исключительные обстоятельства (эти два термина противоположны друг другу) для описания использования исключений. Приведенный выше текст может быть прочитан как поддерживающий либо позицию использования исключений, либо нет (в зависимости от существующих предпочтений читателей как в отношении использования исключений, так и в отношении того, что является нормальным), поэтому он действительно не помогает ответить на вопрос. - person Fred Nurk; 18.12.2010
comment
@Fred Это действительно отвечает на вопрос - иногда вы используете исключения, а иногда нет. - person unquiet mind; 18.12.2010
comment
Также стоит упомянуть, что исключения не очень переносимы, особенно за пределы библиотеки. Например, Mozilla C++ Portability Guide прямо запрещает использование исключений. Поэтому иногда единственная альтернатива, которая у вас есть, это флаг isValid, независимо от того, нормальные это или исключительные обстоятельства. - person Sergei Tachenov; 18.12.2010
comment
Как иногда вы используете исключения, а иногда не помогаете? Очевидный ответ на это - ах, вот почему я спросил, потому что это просто переформулирует вопрос. Учитывая, хотите ли вы чай или кофе?, синтаксически допустимый ответ - да, но это все еще бесполезно по тем же причинам, которые я указал выше. - person Fred Nurk; 22.12.2010