Обработка ошибок в методе класса

317
30 января 2017, 18:13

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

bool insertIntoSomeTable()
{
// нормальный ход выполнения программы
if( ошибка подключения )
{
 lastError=ошибка подключения;
 emit errorHasOccured(lastError);
 return false;
}
// нормальный ход выполнения программы
if( сервер не может принять данные)
{
 lastError=сервер не может принять данные;
 emit errorHasOccured(lastError);
 return false;
}
// нормальный ход выполнения программы
if( ошибка выполения запроса )
{
 lastError=ошибка выполения запроса;
 emit errorHasOccured(lastError);
 return false;
}
//и так далее 
return true
}

В итоге эти if-ы очень загромождают код метода. Нормальной ли практикой будет, если я переопределю свой класс исключений для бд и перепишу метод так:

  bool insertIntoSomeTable()
  {
    try
    {
    // нормальный ход выполнения программы
    if( ошибка подключения )
    {
      throw DatabaseException("Ошибка подключения");
    }
    // нормальный ход выполнения программы
    if( сервер не может принять данные)
    {
      throw DatabaseException("сервер не может принять данные");
    }
    // нормальный ход выполнения программы
    if( ошибка выполения запроса )
    {
      throw DatabaseException("ошибка выполения запроса");
    }
    //и так далее  
    return true
    }
    catch(DatabaseException& e)
    {
    lastError= e.what();
    emit errorHasOccured(lastError);
    return false;
    } 
  }

Ещё,конечно, можно сделать этот метод void, в самом методе делать только throw, а ловить ошибки где-нибудь уровнем выше. Но мне бы не очень хотелось делать так. В общем, нормально ли будет использовать приведенный выше вариант?

Answer 1

Нормальной ли практикой будет, если я переопределю свой класс исключений для бд и перепишу метод так

Будет нормальной.

Пример "неправильных" if-ов

bool Func1() {
  if (err) return false;
  return true;
}
bool Func2() {
  if (err) return false;
  return true;
}
bool Func3() {
  if (err) return false;
  return true;
}
// ...
int MainFunc() {
  if (!Func1()) return -1;
  if (!Func2()) return -2;
  if (!Func3()) return -3;
}

В данном примере выше - явная двойная проверка. Сперва на действие, потом на код возврата. Вот так не нужно. Именно для такого случая, вернее - и в том числе, и придумали обработку исключений.

Было бы правильно так

void Func1() {
  if (err) throw myexception(1);
}
void Func2() {
  if (err) throw myexception(2);
}
void Func3() {
  if (err) throw myexception(3);
}
// ...
int MainFunc() {
  try {
    Func1();
    Func2();
    Func3();
  } catch(myexception &e) {
    // some
  } catch(...) {
    // some
  }
}

Но, если в вашем коде "проверки-не-проверяются" - пишите так, чтобы исключить многословность. В общем, читаем Бритву Оккама)

READ ALSO
'cout << …' или 'cout.put(…)'?

'cout << …' или 'cout.put(…)'?

Что лучше использовать для вывода на консоль символов: 'cout <<

351
Ускорение разбиения текста c++

Ускорение разбиения текста c++

Требуется разбить большой файл (1 600 000 строк) на строки и сохранить в коллекцию с уникальными значениямиПодгрузка файла происходит на javascript,...

322
Как создать оператор += для Point c++ [требует правки]

Как создать оператор += для Point c++ [требует правки]

Нужно создать такой оператор Point& operator+=(Point &, const Point&)

352
Как создать getter для класса Pont c++ [требует правки]

Как создать getter для класса Pont c++ [требует правки]

Помогите создать getter для класса Point double& x();

328