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

Подскажите, пожалуйста, с обработкой ошибок. Наткнулся на статью Романа Элизарова,

и не очень понял, как поступать с "program logic errors".
Что если есть UserRegistrationUseCase, который добавляет пользователя в нашу базу, и ограничения по логике - имя пользователя должно быть не пустым и уникальным. В случае ошибки мы должны бросить exception или возвращать Result<Success, Error>?

12 ответов

6 просмотров

Вероятно, должен быть ещё один юзкейс для проверки данных перед добавлением юзера. Вот он пускай и возвращает соответствующие состояния.

Mark-Yavorskyi Автор вопроса
Leonid B.
Вероятно, должен быть ещё один юзкейс для проверки...

Согласен, но что ему возвращать - exception или Result<Success, Error>?

Mark Yavorskyi
Согласен, но что ему возвращать - exception или Re...

Какое-то состояние - либо через тип exception, либо через Result. Зависит от того, как у вас принято результаты возвращать.

Mark-Yavorskyi Автор вопроса
Leonid B.
Какое-то состояние - либо через тип exception, либ...

Моё приложение - мои правила) (просто личный проект)

Не понял? Тебе надо бросить ошибку что поле ввода пустое?

А, я понял. Ну я бы в самом UseCase написал логику: допустим через регулярное выражение, ну и соответственно что-то такое: suspend fun invoke (login: String) : Result<Data> { val isValidLogin = checkLogin(login) <- там проверь валидность логина и верни boolean результат. return if(isValidLogin) { // отправляем данные в Repository } else { Result.Failure ("Login is not Valid") }

Виталий Анатольевич
А, я понял. Ну я бы в самом UseCase написал логик...

только я бы возвращал не Boolean, а enum или sealed class ошибки, чтобы можно было показать конкретное сообщение, что неверно

Виталий Анатольевич
Ну, или так, я просто накидал идею

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

Имя пользователя вводит пользователь, и значит, что можно заранее ожидать, что оно будет неуникальным, или с недопустимыми символами, или с другими ошибками. Эти ошибки - не логические ошибки в коде программы, а ожидаемые ошибки ввода со стороны пользователя. Согласно статье Романа (спасибо, кстати, что напомнили ее, перечитал с удовольствием), ошибки такого характера стоит моделировать в возвращаемом значении функции, которая создает пользователя.

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А дальше что?.. Записать в файл, потом в Код?.. И потом разбирать как-то?..
Хаскель Моисеевич Гопник
14
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
@y0zhig @shizzard А можно я опишу цель и может вообще ерланг мне не подходит. На текущий момент как я понимаю у ерланга есть легковесные потоки и задача выполняется в каком т...
Дмитрий Спиридонов
5
Есть предложения, как подобное можно упростить?
Hemul GM
12
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
9
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
Карта сайта