Size: a a a

Saint P Ruby Community

2020 January 28

IM

Igor Morozov in Saint P Ruby Community
Aleksandr Kalashnikov
любая библиотека, которая использует эксепшены) я имел в виду, что мы не можем контролировать использование эксепшенов в стороннем коде. мне казалось, что необходимо обрабатывать все исключения, выброшенные ими, даже те, с которыми не можем ничего сделать, но наверно и правда это не нужно делать
но тут ещё какое дело, нужно ли это всё обрабатывать на самом деле

к примеру, когда я работаю с AR (а он кидает исключения), я просто пишу код так, что если исключение падает — значит на самом деле нужно упасть

а вот ловить только те, что на самом деле нужно — ну Try[ExceptionClass] { execute }.to_result и в бой
источник

IL

Ivan Lopatin in Saint P Ruby Community
Alex G
Мне кажется, если основная претензия к исключениям, это запутанность кода (непонятно, где обрабатывается),
то если нет "глобального" обработчика, а они обрабатываются сразу на выходе из "бизнес"-слоя, то разницы с result-объектами не очень много.

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

AD

Anton Davydov in Saint P Ruby Community
обычно в трай заворачиваю любые сообщения со внешними ресурсами: базы, сервисы и прочее
источник

RR

Ruslan Ryabov in Saint P Ruby Community
и не только, логику экспешена поймет даже джун, что вот, тут мы вышли из сервиса, а не прослеживать 100500 измнений состояния
источник

AD

Anton Davydov in Saint P Ruby Community
Ivan Lopatin
для себя вижу плюсы эксепшонов тем что ты можешь выпрыгнуть из очень глубокого кода, когда дальше нет смысла продолжать и обработать его в конечной точке
если дальше развивать эту мысль, то желание вынурнуть из глубокого кода похоже на антипаттерн, для меня это из той же оперы, что и сложность написание теста для кода
источник

IM

Igor Morozov in Saint P Ruby Community
Ruslan Ryabov
и не только, логику экспешена поймет даже джун, что вот, тут мы вышли из сервиса, а не прослеживать 100500 измнений состояния
а return?
источник

AG

Alex G in Saint P Ruby Community
Ivan Lopatin
для себя вижу плюсы эксепшонов тем что ты можешь выпрыгнуть из очень глубокого кода, когда дальше нет смысла продолжать и обработать его в конечной точке
Тогда надо из "очень глубокого" кода выдать что-то вразумительное для "входной" точки, да?
источник

RR

Ruslan Ryabov in Saint P Ruby Community
Igor Morozov
а return?
давай приведу пример, допустим у тебя сервис А вызывает Б  и тот вызывает Д, у тебя произошло “событие” по которому тебе нужно выйти из всех сразу, у тебя плодится ретунт в Д, Б и А, на этот случай, которые прокидывают какой-то стейт или еще что-то

а експешен выйдет сразу из 3х + если тебе надо, на каждом из уровней ты можешь его обработать, тот же retry запустить если необходимо
источник

IL

Ivan Lopatin in Saint P Ruby Community
Anton Davydov
если дальше развивать эту мысль, то желание вынурнуть из глубокого кода похоже на антипаттерн, для меня это из той же оперы, что и сложность написание теста для кода
я не хочу сказать что эксепшоны добро, как выше сказали код может стать запутанным, но мой опыт увы я работал с лютым легаси, когда у тебя 5 классов которые матрешкой, если обрабатывать ошибки по месте бойлерплейт так плодится что уже логики меньше чем кода что ошибки обрабатывает и тут эксепшон спасение, имхо
источник

NS

Nikita Shilnikov in Saint P Ruby Community
есть две вещи, сылочная прозрачность (referential transparency) и частичные функции (partial functions). К первому надо стремиться, второго — избегать. Поддерживаемость кода растет радикально. Эксепшены очень плохо с этим пересекаются
источник

IL

Ivan Lopatin in Saint P Ruby Community
Alex G
Тогда надо из "очень глубокого" кода выдать что-то вразумительное для "входной" точки, да?
там кастомные экспешоны которые вьюха знает как рендерить ну или конечный получатель
источник

A

Alex in Saint P Ruby Community
Ruslan Ryabov
давай приведу пример, допустим у тебя сервис А вызывает Б  и тот вызывает Д, у тебя произошло “событие” по которому тебе нужно выйти из всех сразу, у тебя плодится ретунт в Д, Б и А, на этот случай, которые прокидывают какой-то стейт или еще что-то

а експешен выйдет сразу из 3х + если тебе надо, на каждом из уровней ты можешь его обработать, тот же retry запустить если необходимо
Да, ещё и принцип единой основности пустим под откос.
источник

IM

Igor Morozov in Saint P Ruby Community
Nikita Shilnikov
есть две вещи, сылочная прозрачность (referential transparency) и частичные функции (partial functions). К первому надо стремиться, второго — избегать. Поддерживаемость кода растет радикально. Эксепшены очень плохо с этим пересекаются
плохо пересекаются в смысле «вообще никак не связаны с этими вещами» или «уменьшают ссылочную прозрачность и увеличивают число частичных функций»? я не распарсил сообщение(
источник

NS

Nikita Shilnikov in Saint P Ruby Community
Igor Morozov
плохо пересекаются в смысле «вообще никак не связаны с этими вещами» или «уменьшают ссылочную прозрачность и увеличивают число частичных функций»? я не распарсил сообщение(
все верно
источник

AG

Alex G in Saint P Ruby Community
чтобы продолжать спорить, надо как-то метрику сложности поддержки ввести для одинаковых проектов с разным control flow :)
имхо, исключения продолжают работать как минимум в средних проектах. А как бы они были с монадами там, или еще с чем, мы не узнаем
источник

AG

Alex G in Saint P Ruby Community
разве что @distroid перепишет в do notation свое и нам расскажет
источник

RR

Ruslan Ryabov in Saint P Ruby Community
сомнительно, монады наше легаси в полный ад превратят
и так остался миллион мест, где через цепочку классов проходят хеши с указанием состояния
источник

IM

Igor Morozov in Saint P Ruby Community
ну если у вас опыта с ними немного, то на самом деле можете граблей пособирать. но там дело не в монадах, на самом деле
источник

IM

Igor Morozov in Saint P Ruby Community
так-то чтоб переписать, придётся подразобраться, подрефакторить и кувалдой выпрямить то, что стоит кривовато

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

AG

Alex G in Saint P Ruby Community
Ruslan Ryabov
давай приведу пример, допустим у тебя сервис А вызывает Б  и тот вызывает Д, у тебя произошло “событие” по которому тебе нужно выйти из всех сразу, у тебя плодится ретунт в Д, Б и А, на этот случай, которые прокидывают какой-то стейт или еще что-то

а експешен выйдет сразу из 3х + если тебе надо, на каждом из уровней ты можешь его обработать, тот же retry запустить если необходимо
А если ты решишь в новом сервисе N заюзать Б, то надо будет помнить, что там возможно получить привет от Д. Скорее всего этого никто не будет помнить уже через 3 месяца
источник