resources = {"budget": 100, "stock": 2}
completed = []


def reserve_budget():
    resources["budget"] -= 30


def release_budget():
    resources["budget"] += 30


def reserve_stock():
    resources["stock"] -= 1


def release_stock():
    resources["stock"] += 1


def book_shipping():
    # 明确未发生运输预订，不是网络超时。
    raise ValueError("该地区不提供运输")


steps = [(reserve_budget, release_budget),
         (reserve_stock, release_stock)]
try:
    for forward, compensate in steps:
        forward()
        completed.append(compensate)
    book_shipping()
except ValueError:
    for compensate in reversed(completed):
        compensate()
assert resources == {"budget": 100, "stock": 2}
print("明确失败后，已完成的资源预留被逆序补偿")
