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

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

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

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

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

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

Цитата:
Сообщение от waleri Посмотреть сообщение
А что я можно сделать?
Очевидно речь идет о случаях, когда кроме как показать сообщение об ошибке делать нечего.
именно поэтому, я и решил обратить внимание общественности,
что так делать не хорошо.

в плохом коде только и приходится что разводить руками:
"а что ещё я могу сделать? могу только залоггировать"


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

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

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

поэтому вот так:
Цитата:
Сообщение от waleri Посмотреть сообщение
Много проще в A() вставить try/catch а в Z() сделать throw.
грамотные люди не делают.

Цитата:
Сообщение от waleri Посмотреть сообщение
Еще раз: - исключения - это для исключительных ситуаций.
к чему вообще это было сказано?

Цитата:
Сообщение от waleri Посмотреть сообщение
Я заставляю A() знать про какой-то базовый класс исключения, который должен содержать код и место возникновения ошибки. Исключительно уровень А() решает когда и как показывать сообщения об ошибках. Уровень Z() не должен знать есть у нас логирование, окна, отладчики и иже с ними. Уровень Z() кричит "не могу открыть файл" (хотя это плохой пример, ну да ладно) и этому уровню фиолетово кто и как это будет обрабатывать.
между уровнем A и Z - целый алфавит.

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

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

люди, которые говорят:
"с эксепшенами очень удобно, можно пулять их через десять этажей",
по видимому не знаю, что такое "отказоустойчивость",
и "надежный софт"
_Bers вне форума Ответить с цитированием
Старый 23.08.2017, 01:32   #12
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
с эксепшенами очень удобно, можно пулять их через десять этажей
пфффф...
Код:
void foo(int x)
{
   throw (x*x);
}

int main()
{
   int result = 0;
   try {
      foo(4);
   } catch (int e) {
      result = e;
   }
   std::cout << result << std::endl.
}
Croessmah вне форума Ответить с цитированием
Старый 23.08.2017, 01:32   #13
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
с эксепшенами очень удобно, можно пулять их через десять этажей
пфффф...
Код:
void foo(int x)
{
   throw (x*x);
}

int main()
{
   int result = 0;
   try {
      foo(4);
   } catch (int e) {
      result = e;
   }
   std::cout << result << std::endl.
}
Croessmah вне форума Ответить с цитированием
Старый 23.08.2017, 07:12   #14
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
в хорошем коде исключения не пролетают десять этажей
от самых глубин до майна, где ничего сделать уже нельзя.
И что сделать в хорошем коде, если низший уровень сказал, что сервер базы недоступен или интернета нету и данные получить нельзя?
Цитата:
Сообщение от _Bers Посмотреть сообщение
механизм исключений был придуман для повышения отказоустойчивости систем.
а не для того, что бы только разводить руками, и только логгировать ошибки.
Не знаю для чего там был придуман механизм, а используется он сейчас для всего подряд. Даже для валидации введённых пользователем значений.
Цитата:
Сообщение от _Bers Посмотреть сообщение
любые возможные проблемы решаются максимально близко к месту их возникновения.
Любые исключительные ситуации должны решаться максимально близко к месту их возникновения. Не всегда это возможно. Нужно только следить за возвращаемыми исключениями, чтобы было понятно, что метод А возвращает исключения такого и такого типа, тогда-то и тогда. Будет это переброшенное исключение из другого метода или обёрнутое в своё исключение исключение из другого метода или своё исключение - это не суть важно.
Цитата:
Сообщение от _Bers Посмотреть сообщение
поэтому вот так:

грамотные люди не делают.
так все люди так делают. и грамотные и неграмотные. где-то throw кидается, а уровнем выше он оборачивается в try/catch. других механизмов для исключений нет.
Цитата:
Сообщение от _Bers Посмотреть сообщение
между уровнем A и Z - целый алфавит.

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

я особенно подчеркиваю:
разгребать последствия провала Z,
должен вышестоящий Y,
а не уровень A,
который благодаря инкапсуляции уже понятия не имеет,
что творится в глубине.
и ничего кроме как залоггировать,
уже не сможет.
На уровне Z у нас работа с файлом. Получаем ошибку, что файла нет/занят другим процессом, доступа не имеем к нему. Кидаем исключение. Уровень Y получает его. Что он может сделать? Ничего. Оборачивать пойманное исключение из уровня Z в новое и кидать на уровень X и так его перебрасывать до уровня A? Не лучше, если с уровня Z подконтрольно исходное исключение пролетит все уровни, а тут уже сообщение пользователю вывалится, в лог запись упадёт,...?
Цитата:
Сообщение от _Bers Посмотреть сообщение
люди, которые говорят:
"с эксепшенами очень удобно, можно пулять их через десять этажей",
по видимому не знаю, что такое "отказоустойчивость",
и "надежный софт"
По словам человека вообще нельзя судить какой код он пишет.
pu4koff вне форума Ответить с цитированием
Старый 23.08.2017, 16:36   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
И что сделать в хорошем коде, если низший уровень сказал, что сервер базы недоступен или интернета нету и данные получить нельзя?
зависит от потребностей задачи очевидно жеж.
что вообще за вопрос такой?

например: показать пользователю табличку:
"сервер занят, попробуйте позже"

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Не знаю для чего там был придуман механизм, а используется он сейчас для всего подряд. Даже для валидации введённых пользователем значений.
плохо, что не знаете.

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Любые исключительные ситуации должны решаться максимально близко к месту их возникновения. Не всегда это возможно.
это всегда возможно.

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Нужно только следить за возвращаемыми исключениями, чтобы было понятно, что метод А возвращает исключения такого и такого типа, тогда-то и тогда. Будет это переброшенное исключение из другого метода или обёрнутое в своё исключение исключение из другого метода или своё исключение - это не суть важно.
выше я уже писал в чем заключается важность.

Цитата:
Сообщение от pu4koff Посмотреть сообщение
так все люди так делают. и грамотные и неграмотные. где-то throw кидается, а уровнем выше он оборачивается в try/catch. других механизмов для исключений нет.
не нужно нести чушь.
для исключений есть один единственный механизм.
и он не обязывает вас ловить исключения обязательно уровнем выше.

Цитата:
Сообщение от pu4koff Посмотреть сообщение
На уровне Z у нас работа с файлом. Получаем ошибку, что файла нет/занят другим процессом, доступа не имеем к нему. Кидаем исключение. Уровень Y получает его. Что он может сделать? Ничего
что за неадекватный вопрос?
и такое же неадекватный ответ.

от задачи зависит.

Цитата:
Сообщение от pu4koff Посмотреть сообщение
По словам человека вообще нельзя судить какой код он пишет.
код - мысли программиста.
_Bers вне форума Ответить с цитированием
Старый 23.08.2017, 18:00   #16
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
это всегда возможно.
Это возможно только там, где есть вся необходимая информация.
Код:
void send_packets(vector<data> &packets)
{
   for(auto &packet: packet) {
      send_packet(packet);
   }
   //При отправке одного из пакетов отвалилась сеть.Что делать?
   //Пропустить, фиг на него?
   //Может повторить отправку заново?
   //А через какой интервал?
   //А сколько попыток?
   //Должна программа вообще работать дальше?  
}
На данном уровне нет данных для реакции на исключение.
Ловить его имеет смысл только там, где должна быть реакция.
Максимально близко - понятие растяжимое.

Последний раз редактировалось Croessmah; 23.08.2017 в 18:02.
Croessmah вне форума Ответить с цитированием
Старый 23.08.2017, 20:36   #17
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Очередное обсуждение "протекающих абстракций".. Как всё хорошо должно быть. В теории.

Моё личное мнение - не стоит подходить к вопросам категорично. Если у программиста голова, а не задница, то он сам должен решать, на каком уровне ловить исключения. Осознанно. Понимая плюсы и минусы. Но никак не по готовым рецептам.
Black Fregat вне форума Ответить с цитированием
Старый 24.08.2017, 20:50   #18
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

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

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Код:
void send_packets(vector<data> &packets)
{
   for(auto &packet: packet) {
      send_packet(packet);
   }
   //При отправке одного из пакетов отвалилась сеть.Что делать?
   //Пропустить, фиг на него?
   //Может повторить отправку заново?
   //А через какой интервал?
   //А сколько попыток?
   //Должна программа вообще работать дальше?  
}
задайте эти вопросы автору кода.
он наверное знает, для чего писал его.
чем грозит сбой в работе процедуры.

Цитата:
Сообщение от Croessmah Посмотреть сообщение
На данном уровне нет данных для реакции на исключение.
Ловить его имеет смысл только там, где должна быть реакция.
Максимально близко - понятие растяжимое.
если на данном уровне,
у человека не достаточно знаний о том,
как реагировать на возможные сбои используемых им процедур,
тогда есть смысл задуматься:
не лишний ли это человек для данного уровня?
_Bers вне форума Ответить с цитированием
Старый 24.08.2017, 20:57   #19
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

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

Цитата:
Сообщение от _Bers Посмотреть сообщение
задайте эти вопросы автору кода.
он наверное знает, для чего писал его.
чем грозит сбой в работе процедуры.
И ему виднее где ловить исключение, и как его обрабатывать.
Какой уровень нужно "перезапустить" и нужно ли вообще.
Как написано выше - рецепта нет.
Croessmah вне форума Ответить с цитированием
Старый 25.08.2017, 03:37   #20
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Ура! Про автора вспомнили!))))))))))
Ну это шутливо))
На самом деле я рад развернувшейся дискуссии, и немало почерпнул.
Я понял, что исключения надо применять там, где они уместны, а в остальных случаях надо не лениться продумывать все возможные варианты развития ситуаций, и делать индивидуальную обработку каждой.
KAMLS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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