Предположим, есть класс для работы с базой данный. Есть методы этого класса, которые обрабатывает возможные ошибки через 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
}
}
Но, если в вашем коде "проверки-не-проверяются" - пишите так, чтобы исключить многословность. В общем, читаем Бритву Оккама)
Продвижение своими сайтами как стратегия роста и независимости