Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2017, 13:19   #21
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
В показанном примере исключение выкидывает send_packet, а в send_packets нет никакой информации.
send_packet для красоты был использован?
или программист, который писал его вызов,
знал для чего он это делал?

потому что если знал,
тогда вестимо знал и о том,
чем грозит сбой в работе этой функции.
а стало быть может предусмотреть запасной вариант развития событий.


Цитата:
Сообщение от Croessmah Посмотреть сообщение
И ему виднее где ловить исключение, и как его обрабатывать.
Какой уровень нужно "перезапустить" и нужно ли вообще.
Как написано выше - рецепта нет.
разумеется виднее.

одному персонажику из этой самой темы было очень удобно
ловить эксепшен вылетевший из уровня Z, на уровне A.
а потом разводить руками:
"а что я тут ещё могу сделать? только заллогировать"

наверное, ему тоже было "виднее".

любые ошибки всегда нужно обрабатывать по месту возникновения.

плохой код:
Код:
void send_packets(const vector<data> &packets)
{
   for(const auto &packet: packets)
      send_packet(packet);
}
хороший код:
Код:
void send_packets(const vector<data> &packets)
{
   for(const auto &packet: packets)
      if(!send_packet(packet))
          on_error(packet);
}
_Bers вне форума Ответить с цитированием
Старый 27.08.2017, 13:56   #22
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
одному персонажику из этой самой темы было очень удобно
А нельзя ли повежливей?

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

Речь шла о возвращении кода ошибки vs исключение. В вашем примере "хорошего" кода возвращения кода ошибки я не наблюдаю - ну и в чем разница? Ну да, вы обрабатываете ошибку внутри, ай маладец. А что делаем если ошибка возникла в on_error? При вашем подходе, верхних слой вообще не может узнать что есть ошибка - функция объявлена void.
waleri вне форума Ответить с цитированием
Старый 27.08.2017, 15:36   #23
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Кстати, раз уж тут обсуждали все варианты использования исключений, то еще есть такой (не знаю популярен ли в С++, я использовал в одном проекте, брат и кот пока живы): OperationCancelledException для прерывания работы потока/операции.

Ну то есть во время какой-нибудь долгой операции (загрузка файла по сети, ...) надо периодически проверять не вызвал ли пользователь отмену. И чтоб не добавлять кучу проверок с return'ами в каждой функции проще сделать функцию типа такой
Код:
void throwIfCancelled() const
{
    if (cancelled_)
        throw OperationCancelledException();
}
и вызывать где надо
Код:
void doWork()
{
    ...
    loadInfo(...);
    ...
    downloadFile(...);
    ...
    uploadFile(...);
}

void loadInfo(...)
{
    login();

    throwIfCancelled();

    ...
    const auto items = loadItems();
    for (const auto item : items)
    {
        throwIfCancelled();

        loadItemInfo(item);
        ...
    }
}

void downloadFile(...)
{
    ...
    downloadFileHttp(...);
}

void downloadFileHttp(...)
{
    ...
    while (localSize < remoteSize)
    {
        throwIfCancelled();

        read...(..., BUF_SIZE);
    }
}
Ну и естественно ловить где-то наверху.
Код:
void threadFunc()
{
    try
    {
        doWork();

        onSuccess();
    }
    catch(OperationCancelledException&)
    {
        onCancelled();
    }
    catch(Exception& ex)
    {
        onError(ex.message());
    }
    catch(...)
    {
        onError("Uncaught exception ......");
    }
    onFinished();
}
Что великие гуру думают про это? Есть ли варианты лучше?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 27.08.2017, 16:07   #24
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
хороший код:
Смысл от проверки, если send_packet кидает исключение? )))

Последний раз редактировалось Croessmah; 27.08.2017 в 16:09.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исключения c# CROWN C# (си шарп) 3 21.12.2014 18:29
Исключения в Qt iukash Qt и кроссплатформенное программирование С/С++ 6 16.04.2011 18:54
Исключения C++ Impuls1989 Помощь студентам 2 04.03.2011 00:51
Исключения yurik1982 Фриланс 9 16.02.2010 00:34
Исключения Rifler Общие вопросы Delphi 5 12.11.2008 00:29