Size: a a a

Saint P Ruby Community

2020 January 28

AD

Anton Davydov in Saint P Ruby Community
источник

NS

Nikita Shilnikov in Saint P Ruby Community
Nikita Bulai
User documentation ведёт на 404 :(
🚧🛠
источник

IM

Igor Morozov in Saint P Ruby Community
Закрыто на технические работы попробуйте через 24 часа
источник

MS

Mikhail Sytchev in Saint P Ruby Community
вот где выдавали гем, туда и обращайтесь
источник

AK

Aleksandr Kalashnikov in Saint P Ruby Community
подход результирующих объектов клевый и мы его используем в проекте, но у меня всегда возникали вопросы как его правильно готовить)
в таком подходе есть след проблема: все разрабочитки используют очень много стороннего кода, в котором невозможно контролировать использование эксепшенов.
и я вижу только три варианта, которые все мне не нравятся: либо не отлавливать, что мы не можем обработать, и тогда у нас получается какое-то двоевластие, либо не использовать сторонний код, использующий исключения, что кажется невозможным, либо обрабатывать все исключения при каждом вызове стороннего кода, что несет в себе бойлерплейт.
также непонятно как правильно в последнем варианте логировать или отображать разработчику ошибки, которые мы не можем обработать.
кажется логичным обрабатывать такие в единой точке в базовом контроллере и джобе, но нам нужна информация где была поймана эта ошибка, значит нужно либо передавать в Failure уникальные значения, обозначающие ошибки, что кажется невыполнимым, либо передавать бэктрейс в Failure, что добавит еще бойлерплейт и кажется переизобретением эксепшенов, либо в Failure передавать эксепшен, что не кажется идиоматическим.
источник

IM

Igor Morozov in Saint P Ruby Community
> все разрабочитки используют очень много стороннего кода, в котором невозможно контролировать использование эксепшенов

а расскажи про примеры, пожалуйста
источник

AD

Anton Davydov in Saint P Ruby Community
Aleksandr Kalashnikov
подход результирующих объектов клевый и мы его используем в проекте, но у меня всегда возникали вопросы как его правильно готовить)
в таком подходе есть след проблема: все разрабочитки используют очень много стороннего кода, в котором невозможно контролировать использование эксепшенов.
и я вижу только три варианта, которые все мне не нравятся: либо не отлавливать, что мы не можем обработать, и тогда у нас получается какое-то двоевластие, либо не использовать сторонний код, использующий исключения, что кажется невозможным, либо обрабатывать все исключения при каждом вызове стороннего кода, что несет в себе бойлерплейт.
также непонятно как правильно в последнем варианте логировать или отображать разработчику ошибки, которые мы не можем обработать.
кажется логичным обрабатывать такие в единой точке в базовом контроллере и джобе, но нам нужна информация где была поймана эта ошибка, значит нужно либо передавать в Failure уникальные значения, обозначающие ошибки, что кажется невыполнимым, либо передавать бэктрейс в Failure, что добавит еще бойлерплейт и кажется переизобретением эксепшенов, либо в Failure передавать эксепшен, что не кажется идиоматическим.
про трейс ошибок - никита же сделал все уже
https://dry-rb.org/gems/dry-monads/1.3/tracing-failures/
источник

AD

Anton Davydov in Saint P Ruby Community
Aleksandr Kalashnikov
подход результирующих объектов клевый и мы его используем в проекте, но у меня всегда возникали вопросы как его правильно готовить)
в таком подходе есть след проблема: все разрабочитки используют очень много стороннего кода, в котором невозможно контролировать использование эксепшенов.
и я вижу только три варианта, которые все мне не нравятся: либо не отлавливать, что мы не можем обработать, и тогда у нас получается какое-то двоевластие, либо не использовать сторонний код, использующий исключения, что кажется невозможным, либо обрабатывать все исключения при каждом вызове стороннего кода, что несет в себе бойлерплейт.
также непонятно как правильно в последнем варианте логировать или отображать разработчику ошибки, которые мы не можем обработать.
кажется логичным обрабатывать такие в единой точке в базовом контроллере и джобе, но нам нужна информация где была поймана эта ошибка, значит нужно либо передавать в Failure уникальные значения, обозначающие ошибки, что кажется невыполнимым, либо передавать бэктрейс в Failure, что добавит еще бойлерплейт и кажется переизобретением эксепшенов, либо в Failure передавать эксепшен, что не кажется идиоматическим.
первую часть не смог понять, можно пояснить?
источник

A

Alex in Saint P Ruby Community
либо не отлавливать, что мы не можем обработать, и тогда у нас получается какое-то двоевластие, либо не использовать сторонний код
отлавливать нужно ИСКЛЮЧИТЕЛЬНО то, что умеем обрабатывать
источник

RR

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

AG

Alex G in Saint P Ruby Community
А я только собрался начать миграцию с dry-transaction в dry-монады и do notation.
А может это шанс вернуться к истокам? к исключениям? )
источник

NS

Nikita Shilnikov in Saint P Ruby Community
к лонг джампам
источник

A

Alex in Saint P Ruby Community
Ruslan Ryabov
у нас проект построен на экспшенах, очень удобно, для них сделаны отдельные классы и можно всегда отловить отдельный бизнес кейс (где экспешен это не обязательно ошибка, а просто реакция, в место какого-то стейта\флага) для таких ексепшенов есть отдельный обработчик, все остальное обрабатывается стандартным
Т.е. у вас где-то есть глобальный диспетчер, который знает про все классы-исключений и умеет на них правильно реагировать?
источник

RR

Ruslan Ryabov in Saint P Ruby Community
Alex
Т.е. у вас где-то есть глобальный диспетчер, который знает про все классы-исключений и умеет на них правильно реагировать?
нет, в контроллере как обычно есть rescue_from у которого описана презентация исключений, как их вернуть клиенту, внутри кода, обрабатываются чаще всего только конкретные классы исключений

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

A

Alex in Saint P Ruby Community
((пошел включать песню road to hell))
источник

AK

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

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

AK

Aleksandr Kalashnikov in Saint P Ruby Community
Anton Davydov
про трейс ошибок - никита же сделал все уже
https://dry-rb.org/gems/dry-monads/1.3/tracing-failures/
не знал, спасибо))
источник

AG

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

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

MS

Marat Safin in Saint P Ruby Community
Mikhail Sytchev
в Rust настолько хороошая система исключений, что не пользоваться ей — грех
В расте нет исключений(т.е. есть конечно, но их не надо обрабатывать, они как раз на случай когда надо упасть), а с ошибками они наоборот проебались изначально
источник

A

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