Предположим, есть класс для работы с базой данный. Есть методы этого класса, которые обрабатывает возможные ошибки через 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, а ловить ошибки где-нибудь уровнем выше. Но мне бы не очень хотелось делать так. В общем, нормально ли будет использовать приведенный выше вариант?
Нормальной ли практикой будет, если я переопределю свой класс исключений для бд и перепишу метод так
Будет нормальной.
Пример "неправильных" 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
}
}
Но, если в вашем коде "проверки-не-проверяются" - пишите так, чтобы исключить многословность. В общем, читаем Бритву Оккама)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Требуется разбить большой файл (1 600 000 строк) на строки и сохранить в коллекцию с уникальными значениямиПодгрузка файла происходит на javascript,...
Нужно создать такой оператор Point& operator+=(Point &, const Point&)
Помогите создать getter для класса Point double& x();