LINUX.ORG.RU

Success Exception? WTF?

 , ,


0

0

Здравствуйте мои дорогие, великие программисты, бакалавры и прочие ЛОРовцы включая умнейших анонимусов!

А вот что если я вам скажу следующее:

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

И вот есть код, в котором, где-то в дебрях, при определённых условиях требуется:

а) вывалить сообщение и сделать exit(0);

б) сделать exit(0) без каких либо сообщений вообще.

Приведу простой пример: программа выполняется по крону, и нужно, в случае штатного завершения, не засирать логи кронтаба и не слать емейлы тому, от чьего имени эта программа по крону запускается. Вот тут и пригождается кейс «б» — код завершения есть, а сообщения нет.

К чему это я? А к тому, что можно же использовать для этого исключения. А что? Исключение бросается в исключительной ситуации. Но исключительная ситуация не обязательно ошибка!

И теперь у меня есть «SuccessException(message)» и, конечно, «JustSuccessExit extends SuccessException»

А что вы думаете по этому поводу?

UPD: ПОЖАЛУЙСТА, ПРЕЖДЕ ЧЕМ НАПИСАТЬ СООБЩЕНИЕ — ПРОЧТИТЕ ВЕСЬ ТРЕД!!! СКОРЕЕ ВСЕГО ВАШ ВОПРОС ИЛИ ВАША ПРЕТЕНЗИЯ УЖЕ ОБСУЖДАЛАСЬ!

★★★★★

Последнее исправление: deep-purple (всего исправлений: 2)
Ответ на: комментарий от anonymous

Я так понял

Отличное начало для того чтобы написать любую чушь. Хотя на самом деле ничего ты и не понял.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от anonymous

ты можешь попробовать переписать

Зачем? Какова цель?

или используй какой-то другой подходящий паттерн

Почему он будет подходящий?

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от mord0d

Правильно анон вещает

Не надо пукать тут пока взрослые дяди спички жгут — попа полыхнёт!

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от anonymous

есть ошибка

Но ошибки нет.

однозначно делать явный переход к процедуре обработки ошибки

В моём случае — это процедура обработки всякого разного и в случае когда ошибка и вслучае когда успех.

очередную универсальную хню которая в виде костыля прикручивается ко всему что можно для «единообразия»

Это.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от mord0d

Спросил нормально ли ты делаешь

Я спросил: «А что вы думаете по этому поводу?» Это немного разные вещи.

Получил закономерный фидбек

То что я его получил — это закономерно. А вот то что он закономерный — ну, в среднем по погоде на ЛОРе — да.

Обиделся

Не обиделся, а сам полыхнул. Я ж тоже живой человек. Звиняй что на личности перешел.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Но ошибки нет.

Это.

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

anonymous
()

Ладно ребятки. Тот «гаввах» что я хотел от вас получить — я получил.

Всем кто понял и оценил — спасибо. Всем кто не понял и/или не оценил и/или просто зашел набросить — тоже спасибо. Вобщем спасибо всем кто был в этом чатике. Если есть желание — резвитесь дальше.

Засим отписываюсь от треда. Ну право слово — с вами тут приятно, но надо и поработать. КлАняюся и всех благ!

deep-purple ★★★★★
() автор топика

UPD: ПОЖАЛУЙСТА, ПРЕЖДЕ ЧЕМ НАПИСАТЬ СООБЩЕНИЕ — ПРОЧТИТЕ ВЕСЬ ТРЕД!!! СКОРЕЕ ВСЕГО ВАШ ВОПРОС ИЛИ ВАША ПРЕТЕНЗИЯ УЖЕ ОБСУЖДАЛАСЬ!

Лучше бы варианты достойные прочтения вынес бы в хедпост.

По теме:

подход бред, любой цикл должен завершаться, в том числе и главный цикл обработки событий, исключения, отличающиеся от обвязок вокруг pthread_cancel для выхода из этого цикла - это костыль. Хоть с твоим объяснением, хоть без него. Посмотри на то, как устроен тот-же QApplication::quit. Ну а если код принимающий решение о выходе из приложения не знает про интерфейс приложения, значит ты ещё больше где-то в архитектуре поднакосячил.

pon4ik ★★★★★
()
Ответ на: комментарий от deep-purple

Я спросил: «А что вы думаете по этому поводу?» Это немного разные вещи.

Ну ты спросил, я ответил. Я бы так делать не стал потому что это надевание штанов через голову. Да, работает, но сделано не для того. А если ты начнёшь писать в большой команде и из-за сабжевого костылика посыпется чужой а то и весь общий код… Нутыпонел.

Не обиделся, а сам полыхнул. Я ж тоже живой человек. Звиняй что на личности перешел.

Бывает. Попробуй посмотреть на вещи под другим углом. Но всегда можно забить на мнение окружающих и делать как хочешь, это ведь твой код. ^_~

mord0d ★★★★★
()
Ответ на: комментарий от deep-purple

Зачем? Какова цель?

чтобы не переписывать потом? понимаешь, если ты пронзительно выбросишь исключение, то ты конечно повызываешь те декструкторы которые хотел, но может ещё повызываешь те которые не хотел.

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

ну вот как-то так. тебе виднее конечно, как оно там чё. ну как тебе уже сказали - ты спросил, тебе ответили.

anonymous
()

JustSuccessExit extends SuccessException

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

anonymous
()

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

Если не напишешь, то кому-то придется думать «чо это за фигня». Кто-то сам разберётся.

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

Тред читать не намерен.

anonymous
()

А что вы думаете по этому поводу?

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

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

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

А я начал Го изучать и у меня два ядра.

Владимир

anonymous
()
Ответ на: комментарий от beastie

trap

лол, в тему :D Бисти будь другом анонимуса запости как тему в девелопмент В ваших wiki пишут неправильные опции для проприетарного драйвера Nvidia (комментарий) , а то торвн не хотит (( А у меня сломалося. Может багу подтвердят, а может подскажу что . Ну пажаааааалста. Пожалуйста.

anonymous
()
Ответ на: комментарий от Siborgium

Да, но, например если сравнить оба подхода к кодированию в ситуации добавления нового состояния выхода из основного цикла: в случае goto имя метки пишется дважды: 1) в основном цикле вместе с goto, 2) в месте обработки «исключения».

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

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

Готового кода с goto, мне практически не попадалось, но если приводить пример, то считаю что супер-удачное применение в алгоритме построчной заливки для извлечения связных компонент из leptonica: https://github.com/DanBloomberg/leptonica/blob/master/src/conncomp.c#L706

nikitos ★★★
()

Имхо использование исключений чисто как flow control это рак мозга. Я так пару раз делал, но чисто от лени переделывать интерфейсы, которые используют несколько классов. Понимаю, что это говнокод, и не пытаюсь прикрыть это решение тем что все вокруг мудаки и не понимают. К исключениям отношусь не очень хорошо. Да, структурированная обработка исключений вроде делает яснее логику программы, но с другой стороны, вот блок try {} вот в нем последовательность операторов. Как просто глядя на код понять какой из них может выбросить исключения и соответственно в этой точке прервётся исполнение, и что там могут быть за исключения чтобы понять обработается ошибка в окружающих catch(), а какие из них будут обработаны где-то уровнем выше? Вот эта неявная передача управления затрудняет понимание логики программы и это явно не про поддерживаемость кода. Если ловить и оборачивать каждый эксепшн нижнего уровня в эксепшн текущего, то черт возьми почему просто в явном виде не анализировать и не возвращать код результата выполнения?

Отдельное недоумение вызывает название исключения в виде SuccessException. Ну назови его OtherAppInstanceRunningException и лови в main или где там надо, тогда оно хотя бы понятно о чем это при взгляде на код

cobold ★★★★★
()
Последнее исправление: cobold (всего исправлений: 1)

тред не читай @ сразу отвечай

if (!tryLock(MY_SUPER_LOCK_SEMAPHORE)) {
  throw AlreadyRunningException();
}
//...blah-blah-blah-blah...

и ловить в main() конкретно AlreadyRunningException уже предлагали?

Sectoid ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.