Russian Qt Forum
Ноябрь 24, 2024, 13:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: То что на совести программиста  (Прочитано 4311 раз)
SABROG
Гость
« : Апрель 05, 2007, 17:33 »

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

Код:

bool TForm::WriteConfig()
{
    settings->setValue(QLatin1String("DSN"),edtDSN->text());
    settings->setValue(QLatin1String("STYLE"),cbStyles->currentText());
        switch (settings->status())
        {
        case QSettings::NoError :
              return true;
        case QSettings::AccessError :
              qWarning("Can't write config, access error");
              return false;
        case QSettings::FormatError :
              qWarning("Config file format error");
              return false;
        }
return true;
}


Это кусок из моей программы, тут видно, что проверка на ошибки идет только для второй инструкции setValue. Я бы мог ее продублировать или вынести в отдельный метод, который вызывать после каждой инструкции. Могу бы вообще не ставить проверку. Но хочу сделать по-совести. Одно дело, когда один ключ-параметр, а если их десятки ?
Может использовать inline функции ? Хочется сделать по совести, но стоит ли обрабатывать все Error'ы от каждого класса ? Может есть "красивые" способы ?
Записан
bigirbis
Гость
« Ответ #1 : Апрель 05, 2007, 17:50 »

Тут либо вынесение кода в отдельный метод, либо макрос, типа Q_ASSERT
Записан
SABROG
Гость
« Ответ #2 : Апрель 05, 2007, 18:01 »

Так ведь все равно будет нечто вроде этого:

Код:

Code();
ifError();
Code();
ifError();
Code();
ifError();
Code();
ifError();
Code();
ifError();
Code();
ifError();
Записан
bigirbis
Гость
« Ответ #3 : Апрель 05, 2007, 18:10 »

Можно еще обернуть вызов
settings->setValue(QLatin1String("DSN"),edtDSN->text());
и в получившейся обертке выбрасывать исключение
а потом это все ловить...

Код:
void TForm::setValue(const QString & key, const QVariant & value)
{
        settings->setValue(key, value);
        switch (settings->status())
        {
        case QSettings::AccessError :
              throw AccessException();
        case QSettings::FormatError :
              throw FormatException();
        }
}
Записан
_govorilka
Гость
« Ответ #4 : Апрель 06, 2007, 04:32 »

В ассистенте написано, что qWarning() - это "Debugging Techniques" (Технология отладки), использовать эту функцию в готовой (release) программе, мне кажется, не очень логично. Хотя это замечание не по теме.

Вариант:
isError()
    code()
isError()
    code()

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

Один из моих учителей мне дал очень хороший совет - "везде, где руки тянутся к клавишам ctrl+c, ctrl+v - пиши обёртку"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 21.