Russian Qt Forum

Qt => Общие вопросы => Тема начата: SABROG от Апрель 05, 2007, 17:33



Название: То что на совести программиста
Отправлено: 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 от Апрель 05, 2007, 17:50
Тут либо вынесение кода в отдельный метод, либо макрос, типа Q_ASSERT


Название: То что на совести программиста
Отправлено: SABROG от Апрель 05, 2007, 18:01
Так ведь все равно будет нечто вроде этого:

Код:

Code();
ifError();
Code();
ifError();
Code();
ifError();
Code();
ifError();
Code();
ifError();
Code();
ifError();


Название: То что на совести программиста
Отправлено: bigirbis от Апрель 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();
        }
}


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

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

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

Один из моих учителей мне дал очень хороший совет - "везде, где руки тянутся к клавишам ctrl+c, ctrl+v - пиши обёртку"