267просмотров
22.8%от подписчиков
26 марта 2026 г.
📷 ФотоScore: 294
sealed interface + when = исчерпывающая обработка ошибок API На бэкенде ошибки часто летят через exception: где-то бросили, выше поймали, залогировали, отдали ответ. Но с ростом проекта становится сложнее понять: какие ошибки вообще может вернуть этот endpoint? И какие из них мы забыли обработать. sealed interface делает такие ошибки явной частью контракта: sealed interface CreateOrderError { data class UserNotFound(val userId: Long) : CreateOrderError data class InsufficientBalance( val has: BigDecimal, val need: BigDecimal ) : CreateOrderError data class ItemOutOfStock(val itemId: Long) : CreateOrderError
}
fun createOrder(request: CreateOrderRequest): Either<CreateOrderError, Order> { val user = userRepo.find(request.userId) ?: return Either.Left(CreateOrderError.UserNotFound(request.userId)) // ...
} В контроллере when заставляет обработать каждый вариант: when (val result = orderService.createOrder(request)) { is Either.Right -> call.respond(HttpStatusCode.Created, result.value) is Either.Left -> when (val error = result.value) { is CreateOrderError.UserNotFound -> call.respond(HttpStatusCode.NotFound) is CreateOrderError.InsufficientBalance -> call.respond(HttpStatusCode.PaymentRequired) is CreateOrderError.ItemOutOfStock -> call.respond(HttpStatusCode.Conflict) }
} Добавили новый тип ошибки — компилятор покажет все места, где обработка стала неполной. В этом и главный плюс: ожидаемые бизнес-ошибки становятся не скрытым поведением, а проверяемым контрактом. #backendvk #kotlin #jvm