@proelixir

Страница 842 из 1045
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?

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 - гребаная дыра, если ты что-то туда выложил, то уже нельзя убрать :)

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

Evgeny
27.12.2017
09:26:55
А чем railway плох?
в эликсире неудобен, в отличие от того же rust.

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
пока проблем не было) может ещё не сталкивался, конечно
Ни разу не писали nil в required поле?) повезло)

Но protobuf хорош, это да

Vladimir
27.12.2017
09:29:49
Ни разу не писали nil в required поле?) повезло)
я на эрланге его использую) так что да, не писал)

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 Чем?

Sergey
27.12.2017
09:33:27
Evgeny
27.12.2017
09:34:05
Eugene Чем?
тем же самым "неизолированными побочными эффектами"

какая разница, вернуть ошибку в виде кортежа или в виде эксепшена?

зато эксепшен легко переправить выше, если у функции нет компетенции реагировать на эту ошибку

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

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

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

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

Google
Alexander
27.12.2017
09:41:46
@spscream А вот эту либу вы видели? https://github.com/appcues/exconstructor Тоже похожий функционал... В чём различия?
Не видели, взяли написали себе библиотеку, как нам было удобно и выложили в opensource. Стараемся не завязываться на чужую работу вообще, особенно в минорных либах.

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

Evgeny
27.12.2017
09:44:17
санитайзер в плаг первым ставишь и все
Так куда все же плаг ставить, в эндпоинт?

Vladimir
27.12.2017
09:44:18
+1

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
Вам хорошо, а мне выбирать теперь ))
Будь мужиком, напиши свою :D

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
Будь мужиком, напиши свою :D
Не, я лучше вашу допишу. Если вдруг чего-то не хватит

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 вполне можно

Ключевые слова - error core. Данные надо хранить там, где их не заденет падение того что их обрабатывает. Ценные данные надо хранить дальше. Let it crash нужен, для остального есть руби.
Типа стейты держать в процессах отдельно от процессов с ними работающими? Причем они должны быть еще и не связанными. Тоже решение, но местами это выглядит как оверинжиниринг.

Alexander
27.12.2017
10:08:14
Типа стейты держать в процессах отдельно от процессов с ними работающими? Причем они должны быть еще и не связанными. Тоже решение, но местами это выглядит как оверинжиниринг.
Это то как работает let it crash с той целью с которой он был придуман. Что может упасть — то не хранит ценного состояния, что хранит ценное состояние — то отделено от падающего

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
кроме того эти агенты должны запускаться не самим процессом, а значит нужно еще пиды этих агентов хранить где-то в общем доступе

Страница 842 из 1045