Реализуйте пользовательское исключение для недопустимого перехода статуса заказа.

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

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

Пример:

class InvalidOrderTransition(ValueError):
    def __init__(self, current, target):
        self.current = current
        self.target = target
        super().__init__(f'Переход {current} -> {target} запрещён')

def validate_transition(current, target, allowed):
    if target not in allowed.get(current, set()):
        raise InvalidOrderTransition(current, target)

Таблицу allowed задают по правилам продукта. В web-слое исключение преобразуют в согласованный ответ, а конкурентную смену статуса отдельно защищают транзакцией и версией. Сам класс исключения гонку не устраняет.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее