
Alexander
27.12.2017
09:17:57
насчет того что можно свалить пейлоадом кривым в 500, это даже в рельсе есть и никто не фиксит, все знают где лежит дежурный костыль

Evgeny
27.12.2017
09:18:01
То бишь эксепшены надо таки ловить? А не надеятся на супервизора?
и где он лежит?
в фениксе?

Google

Vladimir
27.12.2017
09:18:52
по-хорошему, мы смотрим в логи, видим что рестартуется. фиксим.
итеративно

Alexander
27.12.2017
09:19:26

Evgeny
27.12.2017
09:22:05

Alex
27.12.2017
09:22:36
https://ru.hexlet.io/courses/erlang_101/lessons/practical_erlang_let_it_crash/theory_unit

Ilja
27.12.2017
09:22:44
Лично я не люблю эксепшены. Они ведь на то и эксепшены, что сигнализируют об исключительной ситуации, когда надо что-то чинить. Тогда это 500, без дураков.
Но когда клиент присылает данные - моя задача провести валидацию То есть выяснить, могу ли я в принципе с ними работать. Если нет - то никакой это не эксепшен, а невалидный запрос. И на тебе в ответ 400 с подробностями, чтобы ты мог на своей стороне починить.
Поэтому, например, я люблю всё, что приходит через http (параметры, json) сначала принимать как текст, а потом уже контролируемо парсить.

Evgeny
27.12.2017
09:23:55
эксепшены можно перехватывать, а можно коды ошибок анализировать, без разницы. Эксепшены просто удобнее, потому что не надо городить railway error handling

Dmitry
27.12.2017
09:24:28
@spscream Почему либа construct, а на кексе - struct?

Vladimir
27.12.2017
09:24:51
Лично я не люблю эксепшены. Они ведь на то и эксепшены, что сигнализируют об исключительной ситуации, когда надо что-то чинить. Тогда это 500, без дураков.
Но когда клиент присылает данные - моя задача провести валидацию То есть выяснить, могу ли я в принципе с ними работать. Если нет - то никакой это не эксепшен, а невалидный запрос. И на тебе в ответ 400 с подробностями, чтобы ты мог на своей стороне починить.
Поэтому, например, я люблю всё, что приходит через http (параметры, json) сначала принимать как текст, а потом уже контролируемо парсить.
Вот да. У себя я использую protobuf. Там валидатор типов генерится автоматически, как часть парсера. Ооочень удобно, и экономит кучу времени. Но валидатор значений, их логической непротиворечивости - это уже руками разбирать.

Alexander
27.12.2017
09:25:02
переименовались вчера, там же в хексе и construct уже

Alex
27.12.2017
09:25:17
Если посмотреть в ретроспективе то мы даже на плюсах двигались в сторону let-it-crash хотя и сами об этом не догадывались

Alexander
27.12.2017
09:25:25
решили, что может быть путаница из-за названия поэтому Struct -> Construct

Vladimir
27.12.2017
09:25:30

Google

Ilja
27.12.2017
09:25:44
А чем railway плох?

Dmitry
27.12.2017
09:26:06
Норм, чё
только удалить надо

Alexander
27.12.2017
09:26:12
hex - гребаная дыра, если ты что-то туда выложил, то уже нельзя убрать :)

Evgeny
27.12.2017
09:26:17

Aleksandr
27.12.2017
09:26:42

Dmitry
27.12.2017
09:26:53
Давайте сделаем свой кекс - с монадами и ооп-перебежчиками

Evgeny
27.12.2017
09:26:55

Vladimir
27.12.2017
09:27:21

Ilja
27.12.2017
09:27:55
Кстати, let-it-crash вовсе не означает, что не надо обрабатывать ошибки.(так в статье написано). Речь о разделении логики основного сценария и логики обработки ошибок. Всему своё место.
И восходит эта идея к Модели Акторов.

Alex
27.12.2017
09:28:08
с наступающим всех

Aleksandr
27.12.2017
09:28:09
Но protobuf хорош, это да

Evgeny
27.12.2017
09:28:40

Vladimir
27.12.2017
09:29:49

Evgeny
27.12.2017
09:30:12
а что эксепшены в эликсире как-то сильно отличаются от плюсов или там рубей?

Ilja
27.12.2017
09:31:00
Почему плохо бросать ошибки? Потому что это приводит к коду с неизолированными побочными эффектами. То есть, внутри функции хорошо перехватывать ошибку при попытке парсить текст в число. Но наружу лучше отдать простой кортеж в любом случае.
Кто рекламирует? Всё равно кто-то должен испытать боль из-за ошибки. И важно, чтобы эта боль применялась адресно, а не к самому крайнему.

Google

Evgeny
27.12.2017
09:31:03
почему их кто-то не любит? нормальный способ оповестить вышестоящее начальство о проблемах

Alex
27.12.2017
09:31:50

Evgeny
27.12.2017
09:31:52
эксепшены можно не любить только по одной причине - просадка производительности, если это критично.
а так - это тот же самый REH

Ilja
27.12.2017
09:33:17
Eugene Чем?

Alexander
27.12.2017
09:33:18

Sergey
27.12.2017
09:33:27

Evgeny
27.12.2017
09:34:05
Eugene Чем?
тем же самым "неизолированными побочными эффектами"
какая разница, вернуть ошибку в виде кортежа или в виде эксепшена?
зато эксепшен легко переправить выше, если у функции нет компетенции реагировать на эту ошибку
допустим у меня некий процесс (в смысле обработка данных, а не процесс эрланга) разбит на много этапов, то ошибки можно обрабатывать на самом верхнем уровне,

Ilja
27.12.2017
09:36:59
Так ведь нет же. Есть шаги вычислений. Вся цепочка в совокупности либо возвращает {:ок, ответ}, либо {:ашипка, {:плохой_жсон, подробности}}. Или какая другая ошибка. Всё чисто, без побочных. Обработал корректный ответ - после этого можешь спокойно промэтчить и обработать ошибки.
Говоря об эксепшенах, не стоит забывать, что они бросаются в пределах одного call stack-а. То есть, в пределах одного (однопоточного) процесса.

Evgeny
27.12.2017
09:37:58
а в функция обрабатывающая жсон вполне может кинуть исключение, вместо возврата кортежа {:ашипка, :плохой жсон}

Ilja
27.12.2017
09:39:35
*отредактировал ответ.

Dmitry
27.12.2017
09:39:43
@spscream А вот эту либу вы видели? https://github.com/appcues/exconstructor
Тоже похожий функционал... В чём различия?

Evgeny
27.12.2017
09:40:48
я к тому, что принципиальной разницы между REH и эксепшенами нет.
только вот REH неудобен, надо либо with использовать либо городить костыли в виде макросов, либо страдать от вложенных структур

Google

Alexander
27.12.2017
09:41:46

Ilja
27.12.2017
09:43:09
Надо какую-нибудь типичную задачу попробовать решить так и этак. И выбрать тот подход, который позволит получить более читаемый и обслуживаемый код. Это тот случай, когда выбор лучше делать, опираясь на опыт, полученный в эксперименте. Тогда любые религиозные споры станут неактуальны.

Evgeny
27.12.2017
09:44:17

Vladimir
27.12.2017
09:44:18
+1

Alex
27.12.2017
09:45:30

Dmitry
27.12.2017
09:46:16

Evgeny
27.12.2017
09:46:17

Ilja
27.12.2017
09:46:25
Кстати, а какие грабли были с with?

Admin
ERROR: S client not available

Alexander
27.12.2017
09:46:32
вот так примерно

Alexander
27.12.2017
09:46:52

Alexander
27.12.2017
09:46:59
в санитайзере сделать разбор и возвращать если не так

Evgeny
27.12.2017
09:47:03
А, значит все-таки в эндпоинт, я так и понял

Alexander
27.12.2017
09:47:19
или отдавать отбратно конн чтобы остальные шаги его забирали

Dmitry
27.12.2017
09:47:36

Evgeny
27.12.2017
09:47:42
Ну это норм

Dmitry
27.12.2017
09:47:48
Тебя хоть найти можно, в отличие от авторов той либы
))

Alexander
27.12.2017
09:48:15
мы эту либу в проде используем, поэтому поддерживать её будем всегда

Google

Alex
27.12.2017
09:48:44

Dmitry
27.12.2017
09:49:20
Хотя, может это и не очень грамотно

Alexander
27.12.2017
09:50:00
кстати там в Readme вроде не все кейсы использования, в тестах более подробно можно посмотреть

Alex
27.12.2017
09:51:50
https://github.com/appcues/exconstructor/blob/master/lib/exconstructor.ex#L158-L159
String.to_atom это же binary_to_atom, а не binary_to_existing_atom?

Vladimir
27.12.2017
09:53:31
/leave
/leave

Alex
27.12.2017
09:53:37
короче, это нельзя в прод

Evgeny
27.12.2017
09:55:47
что за /leave в треде?

Ilja
27.12.2017
09:56:55
Eugene Опять же, в рамках процесса. Как только задача выходит за рамки (например, обращение к БД или другим http-сервисам) - там уже ситуация немного меняется. Например, ждёшь ты ответа от сервиса до таймаута - процесс по таймауту умирает, эксепшена нет. Или твой процесс прилинкован к другому процессу, и они умирают вместе... А так - в подходящих местах эксепшены очень удобно ловить. Просто эти "подходящие" места тобой должны восприниматься как что-то "внутри" твоего мыслительного контекста. То есть, это я так стараюсь к эксепшенам подходить. Несмотря на то, что разные фреймворки дают стандартный хендлинг, я не люблю бросать эксепшены из контроллеров, потому что это делает логику их обработки размазанной по разным местам кода, в том числе и не твоего.

Alex
27.12.2017
09:59:29
https://github.com/appcues/exconstructor/issues/5
ок, претензия снимается, но все равно как-то не очень кошерно

Alexander
27.12.2017
10:00:13
Короче, let it crash - не нужен. ?
Ключевые слова - error core. Данные надо хранить там, где их не заденет падение того что их обрабатывает. Ценные данные надо хранить дальше.
Let it crash нужен, для остального есть руби.


Evgeny
27.12.2017
10:02:30
Eugene Опять же, в рамках процесса. Как только задача выходит за рамки (например, обращение к БД или другим http-сервисам) - там уже ситуация немного меняется. Например, ждёшь ты ответа от сервиса до таймаута - процесс по таймауту умирает, эксепшена нет. Или твой процесс прилинкован к другому процессу, и они умирают вместе... А так - в подходящих местах эксепшены очень удобно ловить. Просто эти "подходящие" места тобой должны восприниматься как что-то "внутри" твоего мыслительного контекста. То есть, это я так стараюсь к эксепшенам подходить. Несмотря на то, что разные фреймворки дают стандартный хендлинг, я не люблю бросать эксепшены из контроллеров, потому что это делает логику их обработки размазанной по разным местам кода, в том числе и не твоего.
Процесс может не умирать, а сам обрабатывать таймауты. Например в том же HTTPoison можно указать таймаут. Бросать эксепшены из контроллеров действительно не лучшая идея, а вот из парсера json вполне можно


Alexander
27.12.2017
10:08:14

Evgeny
27.12.2017
10:08:52
надо подумать над этим

Alexander
27.12.2017
10:09:06
довольно много с первого взгляда лишних строк кода, но вообще это наследие эрланга, и если эликсиру это не нужно — то не нужно было, наверное, делать на beam.
Вон у вас агенты есть, храните состояние в агентах, они вообще ничего не делают же
я в эрланге без них немного страдаю, но пока не собрался запилить либу

Evgeny
27.12.2017
10:09:55
оверхед на пересылку сообщений, ведь со своим стейтом процессу общаться гораздо производительней

Alexander
27.12.2017
10:10:15
компромисс такой вот…

Evgeny
27.12.2017
10:10:46
кроме того эти агенты должны запускаться не самим процессом, а значит нужно еще пиды этих агентов хранить где-то в общем доступе