169 похожих чатов

Интересно, юзал кто-то резалт монады, например https://demystifyfp.gitbook.io/fstoolkit-errorhandling ?) Мы тут

попробовали Орсак и вылезла проблема в целом характерная как мне кажется для любых резалт монад - эрроры нужно группировать в один общий DU. В то же время, в идеале было бы сделать аналогично энву на флексибл тайпах, чтобы в хэндлере ошибки не все возможные ошибки приложения перебирать, а только те, которые конкретно для конкретной апишки могут возникнуть.

17 ответов

4 просмотра

FYI в OCaml это решается через polymorphic variants https://keleshev.com/composable-error-handling-in-ocaml

Я юзаю почти с момента создания. В основном на базе job. Часто используются модификации с переписанным Run. В UI как правило дистанции очень короткие, поэтому ошибки по месту преобразуются либо в строки, либо в промежуточные типы необходимые для запихивания в UI. Т.е. к тексту добавляются иконки, особенности отображения, вплоть до контролов, а также действия пользователя позволяющие решить проблему на основе замкнутых данных. Так что проблемы не чувствуется. В БЛ или комбайнах общего назначения, когда начинают смешиваться ошибки разного уровня нам либо хватает Choice, либо таки пилим отдельные типы. Это дорого, поэтому сразу возникает вопрос, а не слишком ли растянули коммуникации. Если речь идёт об ультимейт методе, к которому будет сведено всё существование либы, то стерпится. Если речь про пересобираемый трансформер, то скорее всего произошёл проёб в архитектуре. // Плюс для геморройных случаев возможны билдеры, что на "плохие" ошибки уходят к подвязанным хендлерам, получают от них заглушку в виде "хорошей" ошибки нужно типа и радостно бегут к выходу. Исходная "плохая" ошибка полноценно разбирается в хендлере, и как правило на основе особенностей задачи. Универсальные решения мне неизвестны. Но всё это бегает на нарощённом гопаке. Понятия не имею, в какой это рокетсайнс может превратиться, если пытаться сидеть на стандартных средствах.

V-S Автор вопроса
Klei
Я юзаю почти с момента создания. В основном на ба...

сорри, я перечитал несколько раз, но так и не понял что ты предлагаешь) ситуация простейшая - есть две функции x1 и x2, которые обращаются к трем функциям, первый к f1 и f2, другой к f2 и f3, каждая функция может кинуть свою ошибку т.е. есть Err1, Err2 и Err3. Если у x1 будет свой DU с ошибками, а у x2 свой, то они в будут друг с другом не совместимы для резалт монад. Соответственно выходит что Err1, Err2, Err3 должны лежать в одном DU, чего хотелось бы избежать

V S
сорри, я перечитал несколько раз, но так и не поня...

Ты спросил, кто юзал. Я ответил и частично объяснил почему нас эта проблема не особо касается. Что в твоём случае делать, понятия не имею. Абстрактная задача требует общего DU. Если не устраивает, ищи решение в особенностях своей задачи. Здесь тоже что и с попытками оптимизации. Можно дрючить массивы, а можно проследить перемещение данных и грамотно накидать счётчиков/кешей/и т.п., чтобы быть готовым к своей квери.

V-S Автор вопроса

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

V S
ну я не очень понял почему вас не касается - у вас...

а чем это плохо? (когда строки в ошибке сидят)

V S
сорри, я перечитал несколько раз, но так и не поня...

Поверх навернуть глобальный список кодов ошибок, из BL летит контейнер, содержащий код ошибки и Content, где болтается уже сериализованная ошибка, которую можно поднять по коду. Громоздко конечно-но похожую хрень в тырпрайзе шарповом лепили, работало.

V S
ну я не очень понял почему вас не касается - у вас...

Бывает, просто вовремя утилизируем конкретные типы через уход в общий тип.

V S
ну я не очень понял почему вас не касается - у вас...

под "сидят строки в ошибке" ты вот такое понимаешь: Result<??'1, string * ??'2> ??

V-S Автор вопроса
dd
а чем это плохо? (когда строки в ошибке сидят)

много чем плохо) нельзя exhaustive match сделать, потом строки влазят в бизнес логику, потом в ошибке часто приходится данные передавать дополнительные данные

V-S Автор вопроса
V-S Автор вопроса
👽
Поверх навернуть глобальный список кодов ошибок, и...

про строки написал) лучший вариант что я знаю это эксепшнов насоздавать и матчить, но exhaustiveness придется оставить

V S
про строки написал) лучший вариант что я знаю это ...

Не, из Content можно десериализовать ошибку и дальше матчить

Функция которая на самом верху (которая вызывает все другие) должна иметь свой DU Errors и мапить Errors из дргих функций в свой DU с помощью Result.MapError

V S
Result<'T, string>

а вот так: type Errors = |X1f2 |X2f2 type MyResult<'T1,'T2> = Result<'T1, Errors * 'T2> ??

V-S Автор вопроса
Oleksandr Maistrenko
Функция которая на самом верху (которая вызывает в...

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

V-S Автор вопроса
gsomix
FYI в OCaml это решается через polymorphic variant...

крутая статья, ровно то что я просил, и даже ишуй у нас есть) https://github.com/fsharp/fslang-suggestions/issues/40 который в итоге ведет на ерэйзд

Похожие вопросы

Обсуждают сегодня

подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
Добрый день. Абракадабра в 12-й студии ввела новый тип поля БД TSQLTimeStampOffset, использую в постгресе timestampz и вот с 12-й версии начались чудеса! До этого поля times...
Delphi Photo
9
Коллеги, здравствуйте! А можно узнать ваше мнение относительно Wolfram Mathematica vs Julia? Просто у меня стоит выбор между тем, чтобы продолжить преподавать Wolfram Mathemat...
Илья Гаража
10
Обновленный chat тестили уже господа? Готовимся на заводы ? Простой проект на ларавель собирает за 1 ответ..
Jacov Borisov
14
А если без шуток, на чем десктоп сейчас пишут кроссплатформенный (ну чтобы с минимальным допиливанием под каждую платформу) и чтобы хорошая производительность софта была. Толь...
🐈
9
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
кому не сложно распишите пожалуйста для какой цели тут вот эти скобки и в них пихается указатель?
Михаил Helper
15
На одной бирже предложили обновить modx evo 1.0.1 Как думаете, стоит браться?
Artem
9
Карта сайта