LINUX.ORG.RU

Success Exception? WTF?

 , ,


0

0

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

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

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

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

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

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

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

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

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

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

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

★★★★★

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

Дык, я не просил разрешения. Я и так уже запилил. Тут больше вопрос: какой будет твоя первая реакция, когда ты это увидишь в коде? А вторая реакция после объяснения по каким причинам это сделано именно так?

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

То есть вместо лаконичного вызова exit(0) (или собственного метода quit()) ты придумал кидать исключение, ловить его где-нибудь в main(), по пути раскручивая километровый стек и потом его обрабатывать и выходить?

Похвально, в стиле C#. Следущий шаг – фабрика фабрик подобных исключений.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

вместо лаконичного вызова exit(0)

Когда ты глубоко в дебрях и у тебя там вокруг одни классы с методами и ты такой, херак, и пишешь «exit(0)»! Ну или вызываешь функцию обертку над выводом мессаджа (который может быть пустым) и затем экситом.

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

Следущий шаг – фабрика фабрик подобных исключений

Ну не перегибай ))

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

Кстати, в месте кетча можно ещё и подумать, писать это в собственный лог или нет, ну и всё такое. А так, ты будешь думать писать в лог или нет прямо в том месте перед тем как написать exit(0) — так что в этом есть смысл.

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

Вот такие мы все зашореные! И ставим слова из умных книжек за истину в любой ситуации! Отцы то завещали! Не упоминай иксепшны в суе!

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

Когда ты глубоко в дебрях и у тебя там вокруг одни классы с методами и ты такой, херак, и пишешь «exit(0)»! Ну или вызываешь функцию обертку над выводом мессаджа (который может быть пустым) и затем экситом.

Если тебя пугает exit(0) посреди ООП-няшек и ушастиков, можно сделать Application.shutdown() для душевного спокойствия.

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

можно сделать Application.shutdown()

Так у тебя при ErrorException тот самый Application.shutdown() в catch блоке и есть, причём гибкое донельзя. Успешное исключение спасает от копипасты же.

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

Что мешает использовать иксепшны в любых исключительных ситуациях включая успешные?

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

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

когда неперехваченный

Ну он же не «ядерный», он прикладной, и гарантированно по своему типу (instanceof) будет перехвачен и обработан.

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

Исключения для детей, рестарты — наше всио!

Эххх... А как начинали то! За здравие! И тут ты такой, тюк, и всё.

Рестартами пусть Лёня Потный занимается в своей поделке.

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

А при чём здесь Лёня Потный?

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

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

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

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

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

Вооо!!! Чувак в статье так мяаааагенько намекает что исключения это не обязательно ошибки )) Это я тут зашел и сразу вывалил.

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

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

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

Что мешает использовать иксепшны в любых исключительных ситуациях включая успешные?

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

tags: лапша, goto

Кстати, не всегда получится отнаследоваться и заменить/расширить шудаун метод, который может оказаться final.

Зато всегда получится сделать статический метод в MyApplication и расширить его так, как тебе нужно.

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

сделать статический метод в MyApplication

Т.е. навернуть еще строчек 300 ненужного говна.

tags: лапша, copypaste

Fixed.

И да — не кутями едиными. Я вообще за все ЯП.

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

Т.е. навернуть еще строчек 300 ненужного говна.

А в try-catch у тебя вместо 300 этого самого бабочки будут летать и единорожки по радуге прыгать?

И да — не кутями едиными.

Где же ты их унюхал. Там же исключения запрещены.

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

Особенно здорово попробовать объяснить это голенгщикам, у которых исключения есть, но пользоваться ими запрещено. Для начала им нужно доказать, что они у них есть, потом показать, что ими пользуются большие дяди (те, кто пишут правила - живут по исключениям). Вот прекрасная статья:

https://medium.com/hackernoon/panic-like-a-pro-89044d5a2d35

После этого они, скорее всего, всё равно тебя сочтут психом.

den73 ★★★★★
()

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

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

Вот представь себе, пришёл ты, допустим, на конференцию, или на собеседование. И вдруг резко захотелось по большой нужде.

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

И вдруг резко захотелось по большой нужде.

Это такой success exception? :)

X512 ★★★★★
()
Ответ на: комментарий от den73

В таком случае предусмотренны wc в здании конференции. А ТС предлагает в этом случае всё бросать и бежать домой (разматывать stack trace и подниматься на верхний уровень), чтобы там обработать ситуацию.

ma1uta ★★★
()

Я понял, я понял, это такие как ты придумывают всякое непотребство типа ErrorCode:success.

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

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

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

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

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

В итоге имеет кривую архитектуру с рядом неявных моментов, которые приведут к тому, что в какой-то момент всё пойдёт по одному месту.

ma1uta ★★★
()

Исключение бросается в исключительной ситуации. Но исключительная ситуация не обязательно ошибка!

Только вот ситуация у тебя совершенно не исключительная.

Nervous ★★★★★
()
Ответ на: комментарий от EXL

Где же ты их унюхал.

Да показалось что повеяло. Ну нет так нет.

Там же исключения запрещены.

Точняк же. Спасибо что напомнил.

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

Вангую проблемы с архитектурой кода

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

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

А ТС предлагает в этом случае всё бросать и бежать домой (разматывать stack trace и подниматься на верхний уровень

Аааа, тогда exit(0) это остановка сердца прямо на собеседовании потому что время пришло, старость, умер собственной смертью )))

В моем случае я ещё и завещание успею оставить. Автоматически! Через общий обработчик.

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

Название ошибки должно отражать суть этой ошибки

Так в моем случае это не ошибка. Ты до сих пор не улавливаешь?

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

Точняк же. Спасибо что напомнил.

Ну можно на сигналах/слотах понаркоманить тогда. Что-то типа emit exit(). Кстати где-то тут на ЛОРе мнение видел, что сигналы/слоты фу-фу-фу, запутывают код, лапша и goto.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от ma1uta

ты полагаешься

Не то что полагаюсь, а гарантирую, что такое исключение будет поймано в нужном месте.

кривую архитектуру

Ты вообще видел архитектуру отличную от той, по шпаргалке которой тебя учили?

всё пойдёт по одному месту

Только у обезьян безмозглых.

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

Только вот ситуация у тебя совершенно не исключительная

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

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

можно на сигналах/слотах понаркоманить тогда. Что-то типа emit exit()

Да, так я выход там примерно и делал. На сигналах, флагах и слотах. Потому что не крестиком на окне единым.

на ЛОРе мнение видел, что сигналы/слоты фу-фу-фу

А сейчас я наблюдаю фу-фу-фу про успешные эксепшны )) Короче, ну серьёзно, если есть инструмент и им можно воспользоваться — почему им не пользоваться? Потому что какая-то баба Маня когда-то в 70-х сказала что иксепш это только для ошибок?

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

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

Приложение запускается по крону. Не должно зависеть от систем инициализации. Сразу по запуску оно пытается залочить семафор (без ожидания). Если удалось — работаем дальше. Если не удалось — значит семафор занят другой копией приложения, запущеной ранее.

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

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

Так в моем случае это не ошибка.

Ну ок, не ошибка, но ты же можешь дать название состоянию приложения? Если у тебя вот прямо там нужно все прибить то статичный метод shutdown(string) тебе в помощь.

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

то статичный метод shutdown(string) тебе в помощь

А у меня нет такого метода. Зато есть единый обработчик исключений.

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

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

den73 ★★★★★
()
Ответ на: комментарий от ya-betmen

Короче ты в ту же степь что и EXL — давай чонить накрутим, лишь-бы иксепшны не пользовать. Ну просто потому, что все ж говорят что иксепшны это только для ошибок. Фу!!! Это у вас наверное сравнимо с зашкваром на зоне. Угадал? Вот так оно глубоко сидит и свербит.

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

Не то что полагаюсь, а гарантирую, что такое исключение будет поймано в нужном месте.

Каким образом гарантируется, что будет поймано в нужном месте?

Ты вообще видел архитектуру отличную от той, по шпаргалке которой тебя учили?

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

Только у обезьян безмозглых.

Человеческий фактор никто не отменял, и тут дело не в безмозглости.

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

Очень странно спрашивать мнение форумчан, а потом поливать их говоном, если их мнение тебе не понравилось (ну если ты не школьник Вася, конечно))).

И, да, судя по твоему описанию

Сразу по запуску оно пытается залочить семафор (без ожидания). Если удалось — работаем дальше.

Это не исключительная ситуация.

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