Size: a a a

Saint P Ruby Community

2020 January 28

IM

Igor Morozov in Saint P Ruby Community
а как оно обогащается?
источник

MS

Mikhail Sytchev in Saint P Ruby Community
> на каждом уровне прикреплять описание и стектрейс и перепаковывать ошибки нижнего уровня в контейнер верхнего
источник

RR

Ruslan Ryabov in Saint P Ruby Community
Mikhail Sytchev
Ребята, сейчас еще накину говна на вентилятор. Вот если эксепшны правильно юзать: для каждой ошибки свой класс, на каждом уровне прикреплять описание и стектрейс и перепаковывать ошибки нижнего уровня в контейнер верхнего, то у тебя ошибка как пузырек высплывает с самого дна обогащаясь состоянием программы, которое привело к ошибке.

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

RR

Ruslan Ryabov in Saint P Ruby Community
Kirill
и таких 110?
да, но их будет больше, огромная система и не все еще обрабатываем
источник

K

Kirill in Saint P Ruby Community
фух, блин я думал за 3 дня накинуть)))
источник

IM

Igor Morozov in Saint P Ruby Community
Mikhail Sytchev
> на каждом уровне прикреплять описание и стектрейс и перепаковывать ошибки нижнего уровня в контейнер верхнего
но это просто преобразование типов
источник

MS

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

K

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

MS

Mikhail Sytchev in Saint P Ruby Community
ты можешь брать и пользоваться
источник

IM

Igor Morozov in Saint P Ruby Community
ну тут ты понимаешь, это не связано с механизмом исключений
источник

RR

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

IM

Igor Morozov in Saint P Ruby Community
Mikhail Sytchev
ты можешь брать и пользоваться
Failure так-то тоже хранит информацию, где был создан)
источник

IM

Igor Morozov in Saint P Ruby Community
Брать типы из одного контейнера и заворачивать в другой на каждом уровне — это не что-то специфичное для исключений
источник

MS

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

K

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

A

Alex in Saint P Ruby Community
Mikhail Sytchev
Ребята, сейчас еще накину говна на вентилятор. Вот если эксепшны правильно юзать: для каждой ошибки свой класс, на каждом уровне прикреплять описание и стектрейс и перепаковывать ошибки нижнего уровня в контейнер верхнего, то у тебя ошибка как пузырек высплывает с самого дна обогащаясь состоянием программы, которое привело к ошибке.

Ты потом в системе сбора и фильтрации логов можешь понять состояние программы, которое привело к ошибке. Если не использовать эксепшны, то как достичь такого понимания внешних факторов, которые привели к ошибке?
Здесь, наверное, пришло время определиться с тем, что есть ошибка:) Ты все правильно описал, исключения так и нужно использовать, нужно собирать трейсы и состояние для анализа. Но мы то обсуждали другуой кейс, когда исключения используются для управления потоком выполнения и состоянием программы.
источник

IM

Igor Morozov in Saint P Ruby Community
Mikhail Sytchev
а вот я кстати монады не пробовал, надо пощупать, каково это
а тут и без монад можно

я могу из функции возвращать тапл: return [:fail, user, :does_not_exist]

на следующем уровне развернул, дополнил контекста, и так дальше
источник

IM

Igor Morozov in Saint P Ruby Community
тот же Interactor и ActiveInteractor это тоже решили уже, и практически без исключений
источник

RR

Ruslan Ryabov in Saint P Ruby Community
Kirill
генерит файлы с папками и классами? может поделишься кусочком?
не, у нас нет генераторов, просто переопределен конструктор на то чтобы принимал def initialize(error_code = nil, extra_data = nil)

а классы вида

module Payment
 class InvalidPaymentMethodError < BaseAppError
   def self.build
     new('4032')
   end
 end
end
источник

MS

Mikhail Sytchev in Saint P Ruby Community
Igor Morozov
а тут и без монад можно

я могу из функции возвращать тапл: return [:fail, user, :does_not_exist]

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